Dalam ilmu statistik, data kategori merupakan salah satu jenis data yang diklasifikasikan berdasarkan kelompok atau kategori tertentu, bukan dalam bentuk angka yang dapat diukur secara langsung. Berbeda dengan data numerik, data kategori bersifat kualitatif dan lebih menekankan pada klasifikasi karakteristik atau atribut tertentu. Data ini dapat bersifat nominal, yaitu tidak memiliki urutan atau hierarki yang jelas (seperti jenis kelamin dan status pernikahan), maupun ordinal, yaitu memiliki tingkatan atau urutan meskipun tidak menunjukkan jarak yang terukur antar kategori (seperti tingkat pendidikan atau preferensi sikap).
Penggunaan data kategori sangat luas dan penting dalam berbagai bidang studi, seperti ilmu sosial, kesehatan, ekonomi, pemasaran, dan psikologi. Dalam konteks ini, data kategori digunakan untuk mengidentifikasi pola, memahami hubungan antarvariabel, serta mengungkap tren yang tidak dapat dianalisis secara langsung melalui pendekatan numerik. Sebagai contoh, variabel seperti jenis kelamin (laki-laki/perempuan), status pernikahan (menikah/belum menikah), tingkat pendidikan (rendah/menengah/tinggi), hingga preferensi konsumen terhadap suatu produk (setuju/netral/tidak setuju), merupakan bagian dari data kategori yang sering di analisis dalam studi empiris.
Karena karakteristiknya yang berbeda dari data numerik, analisis terhadap data kategori memerlukan pendekatan statistik yang spesifik. Beberapa metode yang umum digunakan antara lain adalah tabel kontingensi, uji chi-square, regresi logistik, serta teknik berbasis probabilitas lainnya yang disesuaikan dengan sifat data. Analisis ini tidak hanya penting dalam ranah penelitian konvensional, tetapi juga semakin relevan dalam era digital saat ini. Perkembangan teknologi dan ketersediaan data dalam skala besar telah mendorong pemanfaatan data kategori dalam sistem berbasis machine learning dan kecerdasan buatan, di mana data kualitatif dikodekan dan diolah untuk keperluan klasifikasi, prediksi, maupun pengambilan keputusan yang lebih kompleks.
Dengan memahami karakteristik dan metode analisis yang tepat untuk data kategori, peneliti dapat memperoleh wawasan yang lebih mendalam serta menghasilkan temuan yang lebih akurat dan bermakna, terutama ketika menghadapi permasalahan yang berkaitan dengan perilaku manusia, preferensi individu, atau karakteristik populasi secara umum.
Analisis Data Kategori memiliki banyak tujuan, diantaranya
Analisis terhadap data kategori memberikan kemampuan bagi peneliti untuk mengevaluasi distribusi frekuensi data dalam masing-masing kategori yang diamati. Melalui pendekatan ini, peneliti dapat memperoleh gambaran yang jelas mengenai seberapa besar proporsi tiap kategori dalam suatu variabel, serta mengidentifikasi apakah terdapat dominasi atau ketimpangan distribusi antar kategori. Sebagai ilustrasi, apabila dalam suatu survei dikumpulkan data berdasarkan jenis kelamin responden, yaitu laki-laki dan perempuan, maka analisis kategori memungkinkan untuk menentukan kategori mana yang memiliki jumlah responden lebih besar. Informasi ini penting tidak hanya untuk memahami struktur dasar data, tetapi juga sebagai dasar untuk analisis lanjutan yang melibatkan hubungan antara variabel, misalnya dalam melihat apakah terdapat perbedaan sikap, preferensi, atau perilaku berdasarkan jenis kelamin responden.
Dalam proses analisis data kategori, salah satu tujuan utama adalah mengidentifikasi pola atau tren yang muncul di antara kelompok-kelompok dalam data. Identifikasi ini bertujuan untuk mengungkap kecenderungan dominan atau perbedaan signifikan yang mungkin terdapat antar kategori, sehingga dapat memberikan wawasan yang lebih mendalam terhadap karakteristik data yang dianalisis. Pendekatan ini memungkinkan peneliti untuk memahami bagaimana suatu variabel kategori tersebar dalam populasi, serta mengenali hubungan-hubungan yang mungkin relevan untuk ditindaklanjuti dalam analisis lanjutan.
Sebagai contoh, melalui penggunaan alat bantu visualisasi seperti diagram batang (bar chart) atau diagram lingkaran (pie chart), distribusi frekuensi antar kategori dapat ditampilkan dengan cara yang lebih intuitif dan mudah dipahami. Visualisasi semacam ini sangat efektif dalam menyampaikan informasi secara ringkas, seperti memperlihatkan bahwa sebagian besar responden dalam suatu survei menunjukkan preferensi terhadap merek A, dibandingkan dengan merek B dan C. Temuan semacam ini dapat menjadi indikasi awal adanya pola preferensi konsumen yang dominan, yang kemudian dapat dieksplorasi lebih lanjut dengan teknik analisis statistik yang lebih kompleks.
Dilanjut dari tujuan sebelumnya, peneliti juga dimudahkan dalam pengambilan keputusan dikarenakan tren atau polanya sudah diketahui.
Analisis data kategorik merupakan teknik statistik yang digunakan untuk menganalisis variabel yang bersifat kategori, dimana data bersifat nominal ataupun ordinal.
Data nominal merupakan data yang tidak memiliki tingkatan atau urutan tertentu, contohnya warna, jenis kelamin, dan sejenisnya. Sementara itu, data ordinal adalah data yang memiliki urutan atau peringkat, seperti tingkat pendidikan, penilaian (rating), dan lain sebagainya
Dalam data kategorik, pengelompokan juga bisa didasarkan pada jumlah kategorinya. Data biner mengacu pada data yang hanya memiliki dua kategori, seperti lulus atau tidak lulus. Sementara itu, data multikategori mencakup lebih dari dua kategori.
| Aspek | Data Kategorik | Data Kuantitatif |
|---|---|---|
| Bentuk Nilai | Label/kategori | Angka/numerik |
| Sifat | Kualitatif | Kuantitatif |
| Operasi Matematis | Tidak bisa dihitung rata - rata | Bisa dihitung rata - ratanya |
| Alat Ukur | Skala nominal/ordinal | Skala Interval/ratio |
Analisis data kategori memiliki manfaat luas dalam berbagai bidang,berikut beberapa diantaranya:
| Bidang | Tujuan | Penerapannya |
|---|---|---|
| Pendidikan | Mengevaluasi metode pengarajan | Membuat survei kepuasan mengenai kinerja guru ataupun dosen. |
| Kesehatan | Mengetahui hubungan antara kondisi pasien dan kategori risiko | Melihat hubungan antara status merokok (Ya/Tidak) dan kejadian penyakit jantung |
| Sosial | Menganalisis pola sosial atau opini masyarakat | Menganalisis kepuasan terhadap layanan publik (Sangat Puas – Tidak Puas) berdasarkan wilayah |
| Ekonomi | Mengkategorikan dan menganalisis jenis pekerjaan, status ekonomi | Hubungan antara jenis pekerjaan (formal/informal) dan tingkat pengeluaran rumah tangga |
| Pemasaran | Mengetahui preferensi konsumen berdasarkan demografi atau perilaku | Mengelompokkan pelanggan berdasarkan pilihan produk (A, B, C) dan usia (muda/dewasa/lansia) |
| Politik | Mempetakan dukungan terhadap partai atau isu politik tertentu | Hubungan antara usia pemilih dan pilihan partai dalam survei elektabilitas |
Dalam menganalisis data kategorik, terdapat berbagai metode yang dapat digunakan. Pemilihan metode tersebut disesuaikan dengan tujuan dari penelitian. Diantaranya:
Uji chi-square digunakan untuk mengevaluasi adanya hubungan antara dua variabel. Sebagai contoh, uji ini dapat digunakan untuk mengetahui apakah terdapat keterkaitan antara jenis kelamin dan preferensi terhadap suatu produk
Tujuannya sama seperti uji chi - square, hanya saya uji fisher’s exact digunakan ketika frekuensi data berjumlah kecil (<5).
Regresi logistik digunakan untuk memperkirakan probabilitas terjadinya suatu kategori berdasarkan variabel-variabel prediktor. Sebagai contoh, metode ini dapat digunakan untuk memprediksi apakah seorang siswa akan lulus dengan mempertimbangkan persentase kehadiran, nilai kumulatif, dan faktor lainnya.
Tabulasi silang, atau yang sering disebut crosstab, bertujuan untuk menyajikan distribusi frekuensi dua variabel dalam bentuk tabel. Contohnya, menunjukkan jumlah laki-laki dan perempuan di setiap kelompok umur.
Analisis diskriminan bertujuan untuk mengklasifikasikan objek ke dalam kategori tertentu berdasarkan beberapa variabel. Sebagai contoh, analisis ini dapat digunakan untuk menentukan apakah seorang pelanggan akan memilih produk A, B, atau C berdasarkan pendapatan dan usia.
Bisa dilihat analisis data kategorik memiliki banyak metode untuk digunakan. Oleh karena itu peneliti harus memiliki tujuan yang jelas dan pemahaman untuk bisa meneliti data kategorik dengan metode yang tepat.
Variabel acak kategori adalah variabel yang hanya dapat memiliki beberapa kategori diskrit sebagai hasilnya. Distribusi probabilitas dari variabel ini menggambarkan kemungkinan terjadinya setiap kategori.
Distribusi Bernoulli adalah distribusi probabilitas diskrit yang memiliki dua hasil kemungkinan, yaitu sukses (1) dan gagal (0). Distribusi ini sering digunakan untuk memodelkan percobaan yang hanya memiliki dua kemungkinan hasil, seperti lemparan koin yang menghasilkan kepala atau ekor.
Distribusi Bernoulli memiliki satu parameter, yaitu:
Jika \(X\) adalah peubah acak yang mengikuti distribusi Bernoulli, maka kita tulis:
\[ X \sim \text{Bernoulli}(p) \]
Fungsi probabilitas massal (PMF) dari distribusi Bernoulli didefinisikan sebagai:
\[\begin{equation} P(X = x) = \left\{ \begin{aligned} p & \quad \text{jika } x = 1 \\ 1 - p & \quad \text{jika } x = 0 \end{aligned} \right. \end{equation}\]
atau ditulis sebagai:
\[ P(X = x) = p^x (1 - p)^{1 - x}, \quad x \in \{0, 1\} \]
set.seed(123) # untuk replikasi hasil
n <- 100
hasil <- rbinom(n, size = 1, prob = 0.8)
# Lihat 10 hasil pertama
head(hasil, 10)
## [1] 1 1 1 0 0 1 1 0 1 1
Distribusi Binomial merupakan distribusi probabilitas diskret yang menggambarkan banyaknya keberhasilan dalam serangkaian percobaan Bernoulli yang bersifat independen dan memiliki karakteristik yang sama. Setiap percobaan hanya memiliki dua kemungkinan hasil, yaitu berhasil atau gagal, dengan peluang keberhasilan yang tetap pada setiap percobaan.
Jika \(X\) adalah peubah acak yang mengikuti distribusi binomial, maka ditulis:
\[ X \sim \text{Binomial}(n, p) \]
dengan:
Fungsi probabilitas massal (PMF) dari distribusi binomial:
\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k}, \quad k = 0, 1, 2, ..., n \]
Dengan:
set.seed(123) # agar hasil bisa direproduksi
simulasi <- rbinom(1000, size = 10, prob = 0.9)
head(simulasi, 10)
## [1] 10 8 9 8 7 10 9 8 9 9
Distribusi Multinomial merupakan pengembangan dari distribusi Binomial untuk kasus dengan lebih dari dua hasil. Distribusi ini digunakan untuk menghitung probabilitas hasil dari serangkaian percobaan independen, di mana setiap percobaan memiliki lebih dari dua kemungkinan hasil yang bersifat saling eksklusif.
Jika terdapat \(k\) kategori dan setiap percobaan memiliki probabilitas:
\[ p_1, p_2, ..., p_k \quad \text{dengan} \quad \sum_{i=1}^k p_i = 1 \]
dan dilakukan \(n\) percobaan, maka jumlah hasil dari setiap kategori mengikuti distribusi multinomial:
\[ (X_1, X_2, ..., X_k) \sim \text{Multinomial}(n; p_1, p_2, ..., p_k) \]
Fungsi probabilitas massal (PMF):
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1!x_2!...x_k!} \cdot p_1^{x_1} \cdot p_2^{x_2} \cdots p_k^{x_k} \]
Dengan syarat:
set.seed(123)
multinomial <- rmultinom(n = 1, size = 15, prob = c(0.2, 0.8, 0.6))
multinomial
## [,1]
## [1,] 1
## [2,] 7
## [3,] 7
Distribusi Poisson merupakan distribusi probabilitas diskret yang menggambarkan jumlah kejadian dalam suatu interval waktu atau ruang tertentu, dengan asumsi bahwa:
Kejadian berlangsung secara acak,
Kejadian-kejadian tersebut bersifat independen satu sama lain,
Rata-rata jumlah kejadian dalam setiap interval tetap atau konstan.
Jika \(X\) adalah peubah acak yang mengikuti distribusi Poisson dengan parameter \(\lambda\), maka:
\[ X \sim \text{Poisson}(\lambda) \]
di mana:
Fungsi probabilitas massal (PMF) dari distribusi Poisson adalah:
\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!}, \quad k = 0, 1, 2, ... \]
Sifat-sifat penting:
set.seed(123)
poisson <- rpois(15, lambda = 5)
poisson
## [1] 4 7 4 8 9 2 5 8 5 5 9 5 6 5 2
Desain sampling adalah bagian penting dari tahap awal dalam penelitian, terutama dalam proses pengumpulan data. Tujuan utamanya adalah agar data yang dikumpulkan dapat digunakan untuk menarik kesimpulan yang tepat mengenai populasi.
Dalam analisis data kategori, desain sampling merujuk pada cara atau teknik yang digunakan untuk memilih sampel dari populasi, sehingga data yang diperoleh dapat mencerminkan populasi secara keseluruhan. Pemilihan sampel yang tepat sangat menentukan validitas dan reliabilitas hasil analisis.
Secara umum, desain sampling dalam analisis data kategori dapat dibagi menjadi dua pendekatan utama, yaitu prospective sampling dan retrospective sampling. Masing-masing pendekatan ini memiliki karakteristik dan metode pemilihan sampel yang berbeda.
Prospective sampling adalah metode pengambilan sampel di mana peneliti memantau partisipan dari waktu sekarang ke masa depan untuk mencatat kejadian atau hasil tertentu. Metode ini umumnya diterapkan dalam penelitian longitudinal atau studi kohort prospektif. Beberapa tipe desain sampling dalam pendekatan ini meliputi:
Dalam studi eksperimental, subjek dipilih secara acak untuk dimasukkan ke dalam kelompok perlakuan dan kontrol. Beberapa teknik sampling yang sering digunakan antara lain:
Studi kohort adalah jenis penelitian observasional di mana sekelompok individu (kohort) dengan karakteristik tertentu diikuti selama periode waktu tertentu untuk mengamati bagaimana paparan (exposure) memengaruhi kejadian suatu hasil (misalnya penyakit, perilaku, atau kondisi lainnya). Teknik sampling yang umum digunakan dalam studi kohort meliputi:
Retrospective sampling adalah metode pengambilan sampel dalam penelitian di mana peneliti memeriksa data masa lalu untuk mengidentifikasi subjek berdasarkan outcome (hasil) yang sudah terjadi, kemudian melacak paparan (exposure) atau faktor penyebabnya yang terjadi sebelumnya.
Dalam studi kasus-kontrol, sekelompok individu dengan kondisi tertentu dibandingkan dengan kelompok yang tidak memiliki kondisi tersebut. Beberapa teknik sampling yang umum digunakan antara lain:
Dalam studi kohort retrospektif, data historis digunakan untuk mengelompokkan individu berdasarkan paparan yang dialami, lalu menganalisis hasil yang terjadi. Beberapa teknik sampling yang sering digunakan antara lain:
Tabel kontingensi 2x2 adalah tabel yang digunakan untuk menyajikan data kategorik dari dua variabel yang masing-masing memiliki dua kategori. Tabel ini sangat berguna untuk melihat hubungan atau asosiasi antara dua variabel, misalnya dalam uji chi-kuadrat atau perhitungan risiko relatif (relative risk), perbedaan risiko (risk difference) dan odds ratio.
Struktur umumnya:
| Kategori B1 | Kategori B2 | Total | |
|---|---|---|---|
| Kategori A1 | a | b | a + b |
| Kategori A2 | c | d | c + d |
| Total | a + c | b + d | n |
Peluang bersama adalah probabilitas bahwa kedua variabel terjadi secara bersamaan dalam suatu sel tabel kontingensi:
\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
Peluang marginal adalah probabilitas kejadian suatu variabel tanpa mempertimbangkan variabel lainnya.
\[ P(A_i) = \frac{n_{i.}}{n} \]
\[ P(B_j) = \frac{n_{.j}}{n} \]
Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain telah terjadi:
\[ P(B_j | A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i.}} \]
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| tabel data kontingensih 2x2 | Col3 | Col4 | |
|---|---|---|---|
Langkah 1 : Hitung Peluang Bersama
Langkah 2 : Hitung Peluang Marginal
Langkah 3 : Hitung Peluang Bersyarat
\[ P(\text{Controlled}|\text{Surgery}) = \frac{144}{1873} = 0.0768 \]
\[ P(\text{Controlled}|\text{Radiation}) = \frac{50}{1340} = 0.0373 \]
\[ P(\text{Not Controlled}|\text{Surgery}) = \frac{1729}{1873} = 0.9231 \]
\[ P(\text{Not Controlled}|\text{Radiation}) = \frac{1290}{1340} = 0.9626 \]
#Data
data <- matrix(c(144,1729,50,1290), nrow = 2, byrow = TRUE)
colnames(data) <- c("major depression yes", "major depression no")
rownames(data) <- c("ever smoked yes","ever smoked no")
n <- sum(data)
#Peluang Bersama
p_bersama <- data/n
#Peluang Marginal
p_marginal_baris <- rowSums(data)/n
p_marginal_kolumn <- colSums(data)/n
#Peluang Bersyarat
p_bersyarat <- data / rowSums(data)
#Hasil
list(Peluang_Bersama = p_bersama, Peluang_Marginal_Baris = p_marginal_baris, Peluang_Marginal_Kolumn = p_marginal_kolumn, Peluang_Bersyarat = p_bersyarat)
## $Peluang_Bersama
## major depression yes major depression no
## ever smoked yes 0.04481793 0.5381264
## ever smoked no 0.01556178 0.4014939
##
## $Peluang_Marginal_Baris
## ever smoked yes ever smoked no
## 0.5829443 0.4170557
##
## $Peluang_Marginal_Kolumn
## major depression yes major depression no
## 0.06037971 0.93962029
##
## $Peluang_Bersyarat
## major depression yes major depression no
## ever smoked yes 0.07688201 0.9231180
## ever smoked no 0.03731343 0.9626866
Intepretasi : Berdasarkan hasil analisis peluang, terlihat bahwa sebagian besar responden (58,29%) adalah individu yang pernah merokok, dan mayoritas (93,96%) tidak mengalami depresi berat. Peluang bersama menunjukkan bahwa 5,38% dari seluruh populasi pernah merokok dan tidak mengalami depresi, sedangkan hanya 4,48% yang pernah merokok dan mengalami depresi. Sementara itu, dari mereka yang tidak pernah merokok, hanya 1,56% mengalami depresi dan 40,15% tidak mengalami depresi. Jika dilihat dari peluang bersyarat, proporsi individu yang mengalami depresi di antara perokok (7,69%) lebih tinggi dibandingkan dengan yang tidak merokok (3,73%), menunjukkan adanya indikasi bahwa pernah merokok berkaitan dengan kemungkinan lebih tinggi mengalami depresi, meskipun hubungan ini perlu dianalisis lebih lanjut untuk memastikan signifikansi dan kekuatan asosiasinya.
Ukuran asosiasi dalam analisis data kategorik berfungsi untuk menilai seberapa kuat hubungan antara dua variabel kategorik. Hal ini penting untuk menentukan apakah hubungan tersebut signifikan serta sejauh mana kekuatannya. Beberapa ukuran asosiasi yang sering digunakan antara lain:
Risk Difference (atau yang juga dikenal sebagai Absolute Risk Reduction) merupakan ukuran yang menghitung selisih risiko antara dua kelompok. Nilai RD merepresentasikan perbedaan proporsi kejadian antara kelompok yang mengalami paparan dan kelompok yang tidak terpapar.
Rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \] Dengan
Jika RD>0, maka risiko kejadian lebih tinggi di Grup 1 dibandingkan Grup 2
Jika RD<0, maka risiko kejadian lebih rendah di Grup 1 dibandingkan Grup 2
Jika RD=0, maka tidak ada perbedaan risiko antara dua kelompok.
Relative Risk membandingkan kemungkinan terjadinya suatu kejadian (misalnya penyakit) pada kelompok yang terpapar terhadap kelompok yang tidak terpapar.
Rumus:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \] Dengan
Jika RR>1, maka kejadian lebih sering terjadi di Grup 1 dibandingkan Grup 2.
Jika RR<1, maka kejadian lebih jarang terjadi di Grup 1 dibandingkan Grup 2.
Jika RR=1, maka tidak ada perbedaan risiko antara dua kelompok.
Odds Ratio digunakan untuk membandingkan peluang (odds) terjadinya suatu kejadian antara dua kelompok. Sangat umum dalam studi kasus-kontrol.
Rumus:
\[ OR = \frac{a \cdot d}{b \cdot c} \]
Dengan
Jika OR>1, maka peluang kejadian lebih besar di Grup 1 dibandingkan Grup 2.
Jika OR<1, maka peluang kejadian lebih kecil di Grup 1 dibandingkan Grup 2.
Jika OR=1, maka tidak ada perbedaan peluang kejadian antara dua kelompok.
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
Risk Difference \[ RD = \frac{a}{a + b} - \frac{c}{c + d} = \frac{144}{1873} - \frac{50}{1340} = 0.0768 - 0.0373 = 0.0395 \]
Relative Risk \[ RR = \frac{a / (a + b)}{c / (c + d)} = \frac{144/1873}{50/1340} = 0.0768 / 0.0373 = 2.058 \]
Odds Ratio \[OR = \frac{a \cdot d}{b \cdot c} = \frac{144 \cdot 1290}{1729\cdot 50} = \frac{185.760}{86.450} = 2.1487 \]
# Data
a <- 144
b <- 1729
c <- 50
d <- 1290
# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
# Odds Ratio
OR <- (a * d) / (b * c)
#Hasil
list(Risk_Difference = RD, Relative_Risk = RR, Odds_Ratio = OR)
## $Risk_Difference
## [1] 0.03956857
##
## $Relative_Risk
## [1] 2.060438
##
## $Odds_Ratio
## [1] 2.148757
Intepretasi :
RD = 0.0797 → Terdapat perbedaan risiko sebesar 7.97% lebih tinggi pada pasien yang menjalani operasi dibanding terapi radiasi.
RR = 1.0952 → Pasien operasi memiliki kemungkinan 1.095 kali lebih besar untuk mengontrol kanker.
OR = 2.10 → Peluang kontrol kanker pada pasien operasi 2.1 kali lebih besar dibanding terapi radiasi.
Inferensi dalam statistik mengacu pada proses pengambilan kesimpulan mengenai populasi berdasarkan sampel data. Dalam konteks tabel kontingensi dua arah, inferensi digunakan untuk menganalisis hubungan antara dua variabel kategorikal yang disusun dalam tabel kontingensi. Inferensi dalam tabel kontingensi dua arah dapat dibagi menjadi dua kategori utama : - Estimasi - Pengujian
Estimasi bertujuan untuk memperkirakan parameter populasi berdasarkan data sampel. Estimasi dibagi menjadi :
Estimasi titik digunakan untuk menentukan satu nilai spesifik sebagai perkiraan terbaik dari parameter populasi.
\[ \hat{p} = \frac{x}{n} \]
dimana:
- \(\hat{p}\) adalah estimasi titik
proporsi,
- \(x\) adalah jumlah individu dalam
kategori tertentu,
- \(n\) adalah total jumlah individu
dalam sampel.
Estimasi interval bertujuan untuk memberikan rentang nilai yang diyakini mengandung parameter populasi dengan tingkat kepercayaan tertentu.
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{ \frac{\hat{p}(1 - \hat{p})}{n} } \]
dimana:
Uji proporsi digunakan untuk membandingkan proporsi kejadian antara dua kelompok dalam tabel kontingensi, terutama untuk menentukan apkah terdapat perbedaan yang signifikan dalam proporsi kejadian antara dua kelompok yang berbeda.
Untk menguji hipotesis bahwa tidak ada perbedaan proporsi antara dua kelompok, kita menggunakan uji z dua proporsi, dengan hipotesis:
- Hipotesis Nol (H0) : tidak ada perbedaan proporsi antara dua kelompok
- Hipotesis Alternatif (H1) : terdapat perbedaan proporsi antara dua kelompok
Estimasi proporsi dalam masing - masing kelompok diberikan oleh :
\[ \hat{p}_1 = \frac{a}{a + b} \], \[ \hat{p}_2 = \frac{c}{c + d} \]
Estimasi proporsi gabungan
\[ \hat{p} = \frac{x_1 + x_2}{n_1 + n_2} \]
Statistik uji untuk uji proporsi dua sampel :
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
Setelah ketemu nilai Z, kita bisa melihat keputusan apakah tolak H0 atau terima H0 dengan cara apabila |Z| lebih besar dari nilai kritis tertentu untuk tingkat signifikansi tertentu, maka H0 ditolak.
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
Proporsi pada Surgery:
\[ \hat{p}_1 = \frac{144}{1873} \approx 0.0768 \]
Proporsi pada Radiation Therapy:
\[ \hat{p}_2 = \frac{50}{1340} \approx 0.0737 \]
\[ \hat{p} = \frac{144 + 50}{1873 + 1340} = \frac{194}{3213} \approx 0.0621 \]
Rumus:
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2} \right)}} \]
\[ Z = \frac{0.0768 - 0.0373}{\sqrt{0.0621(1 - 0.0621)\left(\frac{1}{1873} + \frac{1}{1340} \right)}} \approx \frac{0.0375}{\sqrt{0.0582\cdot 0.0012}} \approx \frac{0.0375}{0.00836} \approx 4.4856\]
# Data
x1 <- 144 # success in surgery
n1 <- 1873 # total in surgery
x2 <- 50 # success in radiation
n2 <- 1340 # total in radiation
# Proporsi masing-masing kelompok
p1 <- x1 / n1
p2 <- x2 / n2
# Proporsi gabungan
p_pool <- (x1 + x2) / (n1 + n2)
# Statistik uji Z
Z <- (p1 - p2) / sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
# Tampilkan hasil
p1
## [1] 0.07688201
p2
## [1] 0.03731343
p_pool
## [1] 0.06037971
Z
## [1] 4.642957
Intepretasi : Jika kita menggunakan taraf signifikansinya 5%, kita menerima H0 karena nilai |Z| yaitu 0.0774 < dari 1.96 yang berarti bahwa tidak ada perbedaan proporsi antar kelompok.
Uji asosiasi dalam tabel kontingensi 2×2bertujuan untuk mengukur hubungan antara dua variabel kate gori. Untuk setiap uji asosiasi, hipotesis yang diuji adalah :
Tiga ukuran utama dalam uji asosiasi adalah:
Risk difference mengukur perbedaan absolut dalam probabilitas kejadian antara dua kelompok.
Rumus : \[ RD = \frac{a}{a + b} - \frac{c}{c + d} \] Standar Error untuk RD \[ SE(RD) = \sqrt{ \frac{p_1(1 - p_1)}{n_1} + \frac{p_2(1 - p_2)}{n_2} } \]
Statistik uji Z untuk RD \[ Z = \frac{RD}{SE(RD)} \]
Perbandingan antara risiko kejadian di kelompok 1 dibanding kelompok 2.
Rumus:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Standar Error untuk RR \[ SE(\log(RR)) = \sqrt{ \frac{1 - p_1}{n_1 p_1} + \frac{1 - p_2}{n_2 p_2} } \]
Statistik uji Z untuk RR \[ Z = \frac{\log(RR)}{SE(\log(RR))} \]
Perbandingan peluang kejadian antara dua kelompok
Rumus: \[ OR = \frac{a \cdot d}{b \cdot c} \] Standar error untuk log(OR) \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]
Statistik uji Z untuk OR \[ Z = \frac{\log(OR)}{SE(\log(OR))} \]
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
Perhitungan Manual :
\[ \hat{p}_1 = \frac{144}{1873} = 0.0768, \quad \hat{p}_2 = \frac{50}{1340} = 0,0373 \]
\[ RD = 0.0768 - 0.0373 = 0.0395 \]
Standard Error:
\[ SE(RD) = \sqrt{ \frac{0.0768 \times (1 - 0.0768)}{1873} + \frac{0.0373 \times (1 - 0.0373)}{1340} } \]
\[ = \sqrt{ \frac{0.0709}{1873} + \frac{0.0233}{1340} } = \sqrt{0.0000378 + 0.0000173} = 0.00615 \]
Statistik uji Z:
\[ Z_{RD} = \frac{RD}{SE(RD)} = \frac{0.0395}{0.00615} \approx 6.4222 \]
\[ RR = \frac{0.0768}{0.0373} = 2.058 \]
Standard Error log(RR):
\[ SE(\log(RR)) = \sqrt{ \left( \frac{1}{144} - \frac{1}{1873} \right) + \left( \frac{1}{50} - \frac{1}{1340} \right) } \]
\[ = \sqrt{(0.006944 - 0.00053) + (0.02 - 0.000746)} = \sqrt{0.00641 + 0.001925} = \sqrt{0.002566} = 0.05065 \]
Statistik uji Z:
\[ Z_{RR} = \frac{\log(2.058)}{0.05065} = \frac{0.3134}{0.05065} \approx 6.1875 \]
\[ OR = \frac{a \cdot d}{b \cdot c} = \frac{144 \cdot 1290}{1729 \cdot 50} = \frac{185760}{86450} = 2.1487 \]
Standard Error log(OR):
\[ SE(\log(OR)) = \sqrt{ \frac{1}{144} + \frac{1}{1729} + \frac{1}{50} + \frac{1}{1290} } = \sqrt{0.00694+ 0.000578 + 0.02 + 0.000775} = \sqrt{0.02829} = 0.1681 \]
Statistik uji Z:
\[ Z_{OR} = \frac{\log(2.1487)}{0.1681} = \frac{0.3321}{0.1681} \approx 1.976 \]
Perhitungan dengan R
# Data dari tabel 2x2
a <- 144 # Surgery, Cancer Controlled
b <- 1729 # Surgery, Not Controlled
c <- 50 # Radiation Therapy, Cancer Controlled
d <- 1290 # Radiation Therapy, Not Controlled
# Total masing-masing grup
n1 <- a + b # Surgery
n2 <- c + d # Radiation Therapy
# Proporsi
p1 <- a / n1
p2 <- c / n2
### --- 1. Risk Difference (RD) ---
RD <- p1 - p2
# Standard Error RD
SE_RD <- sqrt((p1 * (1 - p1)) / n1 + (p2 * (1 - p2)) / n2)
# Z-test RD
Z_RD <- RD / SE_RD
cat("Risk Difference (RD):", RD, "\n")
## Risk Difference (RD): 0.03956857
cat("Standard Error RD:", SE_RD, "\n")
## Standard Error RD: 0.008043539
cat("Z statistic RD:", Z_RD, "\n\n")
## Z statistic RD: 4.919299
### --- 2. Relative Risk (RR) ---
RR <- p1 / p2
# SE log(RR)
SE_log_RR <- sqrt((1/a - 1/n1) + (1/c - 1/n2))
# Z-test RR
Z_RR <- log(RR) / SE_log_RR
cat("Relative Risk (RR):", RR, "\n")
## Relative Risk (RR): 2.060438
cat("Standard Error log(RR):", SE_log_RR, "\n")
## Standard Error log(RR): 0.1602007
cat("Z statistic RR:", Z_RR, "\n\n")
## Z statistic RR: 4.512579
### --- 3. Odds Ratio (OR) ---
OR <- (a * d) / (b * c)
# SE log(OR)
SE_log_OR <- sqrt(1/a + 1/b + 1/c + 1/d)
# Z-test OR
Z_OR <- log(OR) / SE_log_OR
cat("Odds Ratio (OR):", OR, "\n")
## Odds Ratio (OR): 2.148757
cat("Standard Error log(OR):", SE_log_OR, "\n")
## Standard Error log(OR): 0.1682201
cat("Z statistic OR:", Z_OR, "\n")
## Z statistic OR: 4.546955
Uji independensi digunakan untuk menentukan apakah ada hubungan statistik antara dua variabel kategorikal.
Uji Chi-Square digunakan untuk menguji apakah ada hubungan antara dua variabel kategorikal.
Rumus Chi-Square
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
di mana:
\[ E_{ij} = \frac{R_i \times C_j}{N} \]
dengan:
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
Perhitungan Manual
Langkah 1: Hitung nilai yang diharapkan (E)
Nilai yang diharapkan \(E_{ij}\) dihitung dengan rumus:
\[ E_{ij} = \frac{R_i \times C_j}{N} \]
di mana:
Menghitung nilai yang diharapkan:
Untuk Surgery, Cancer Controlled (\(E_{11}\)):
\[ E_{11} = \frac{(1873 \times 194)}{3213} = 366.575 \]
Untuk Surgery, Cancer Not Controlled (\(E_{12}\)):
\[ E_{12} = \frac{(1873 \times 3019)}{3213} = 1759.90 \]
Untuk Radiation Therapy, Cancer Controlled (\(E_{21}\)):
\[ E_{21} = \frac{(1340 \times 194)}{3213} = 60.056 \]
Untuk Radiation Therapy, Cancer Not Controlled (\(E_{22}\)):
\[ E_{22} = \frac{(1340 \times 3019)}{3213} = 1259.091 \]
Langkah 2: Hitung Chi-Square (\(\chi^2\))
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Dengan:
Untuk Surgery, Cancer Controlled (\(O_{11} = 144\), \(E_{11} = 366.575\)):
\[ \frac{(144 - 366.575)^2}{366.575} = \frac{37085.13}{366.575} = 135.141 \]
Untuk Surgery, Cancer Not Controlled (\(O_{12} = 1729\), \(E_{12} = 1759.90\)):
\[ \frac{(1729 - 1759.90)^2}{1759.90} = \frac{0954.81}{1759.90} = 0.5443 \]
Untuk Radiation Therapy, Cancer Controlled (\(O_{21} = 50\), \(E_{21} = 60.056\)):
\[ \frac{(50 - 60.056)^2}{60.056} = \frac{111.51}{60.056} = 1.856 \]
Untuk Radiation Therapy, Cancer Not Controlled (\(O_{22} = 1290\), \(E_{22} = 1259.091\)):
\[ \frac{(1290 - 1249.091)^2}{1259.091} = \frac{1673.54}{1259.091} = 1.3398 \]
Chi-Square Total:
\[ \chi^2 = 135.141 + 0.5443 + 1.856 + 1.3398 = 0.5895 \]
Perhitungan dengan R
# Membuat data tabel 2x2
data <- matrix(c(144, 1729, 50, 1290), nrow = 2, byrow = TRUE)
# Menambahkan nama baris dan kolom
rownames(data) <- c("Surgery", "Radiation Therapy")
colnames(data) <- c("Cancer Controlled", "Cancer Not Controlled")
# Menampilkan data tabel
data
## Cancer Controlled Cancer Not Controlled
## Surgery 144 1729
## Radiation Therapy 50 1290
# Menghitung chi-square
chi_square_test <- chisq.test(data)
# Menampilkan hasil uji chi-square
chi_square_test
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 20.865, df = 1, p-value = 4.928e-06
Intepretasi : Jika kita menggunakan taraf signifikansi 5% dan denganderajat kebebasan (𝑑𝑓) = (2 − 1)(2 − 1) = 1, kita membandingkan dengan tabel 𝜒2, adalah 3.841 dan jika p-value < 0.05, kita menolak hipotesis nol. Bisa dilihat bahwa kita memiliki p value sebesar 0.7694 yang berarti kita menerima H0.
Partisi Chi-Square Partisi Chi-Square digunakan untuk mengidentifikasi kategori mana dalam tabel kontingensi yang bertanggung jawab atas hubungan yang signifikan. Jika uji Chi-Square pada tabel kontingensi I×Jsignifikan, maka partisi Chi-Square memungkinkan kita untuk menguraikan efek hubungan dalam subkelompok yang lebih kecil.
Penelitian ini dilakukan untuk mengevaluasi apakah terdapat hubungan antara tingkat kebiasaan merokok (dalam jumlah batang rokok per hari) dan risiko terkena myocardial infarction (MI) atau serangan jantung. Data diperoleh dari studi yang dilakukan oleh S. Shapiro et al. dan diterbitkan dalam The Lancet tahun 1979.
| 0 Cigarettes / day | 1-24 Cigarettes / day | >25 Cigarettes / day | Total | |
|---|---|---|---|---|
| Control | 25 | 25 | 12 | 62 |
| Myocardial infarction | 0 | 1 | 3 | 4 |
| Total | 25 | 26 | 15 | 66 |
Perhitungan Manual Langkah 1: Menghitung Frekuensi yang Diharapkan
Frekuensi yang diharapkan dihitung menggunakan rumus:
\[ E_i = \frac{(Total \, \text{Baris}) \times (Total \, \text{Kolom})}{Grand \, \text{Total}} \]
Berdasarkan tabel di atas, kita dapat menghitung frekuensi yang diharapkan untuk setiap sel sebagai berikut:
\[ E_{1,1} = \frac{62 \times 25}{66} = 23.636 \] \[ E_{1,2} = \frac{62 \times 26}{66} = 24.545 \] \[ E_{1,3} = \frac{62 \times 15}{66} = 14.091 \] \[ E_{2,1} = \frac{4 \times 25}{66} = 1.515 \] \[ E_{2,2} = \frac{4 \times 26}{66} = 1.515 \] \[ E_{2,3} = \frac{4 \times 15}{66} = 0.909 \]
Langkah 2: Menghitung Statistik Chi-Square
Sekarang kita dapat menghitung statistik chi-square (\(\chi^2\)) dengan rumus:
\[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \]
Dimana \(O_i\) adalah frekuensi yang diamati dan \(E_i\) adalah frekuensi yang diharapkan. Berdasarkan data yang ada, kita menghitung chi-square untuk setiap sel:
\[ \chi^2 = \frac{(25 - 23.636)^2}{23.636} + \frac{(25 - 24.545)^2}{24.545} + \frac{(12 - 14.091)^2}{14.091} + \frac{(0 - 1.515)^2}{1.515} + \frac{(1 - 1.515)^2}{1.515} + \frac{(3 - 0.909)^2}{0.909} \]
\[ \chi^2 = 0.0785 + 0.0084 + 0.3107 + 1.513 + 0.1754 + 4.809 = 6.895 \]Pehitungan Dengan R
# Membuat matriks data
data_matrix <- matrix(c(25, 25, 12, 0, 1, 3), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("0 Cigarettes / day", "1-24 Cigarettes / day", ">25 Cigarettes / day")
rownames(data_matrix) <- c("Control", "Myocardial infarction")
# Melakukan uji chi-square
chi_square_test <- chisq.test(data_matrix)
## Warning in chisq.test(data_matrix): Chi-squared approximation may be incorrect
# Menampilkan hasil uji
chi_square_test
##
## Pearson's Chi-squared test
##
## data: data_matrix
## X-squared = 6.9562, df = 2, p-value = 0.03087
Intepretasi : Jika kita menggunakan taraf signifikansi 5%, maka kita menolak H0 dikarenakan p value yang didapatkan adalah 0.03087 dimana lebih kecil dari 0.05. Karena menolak H0 berarti terdapat hubungan signifikan antara merokok dan kejadian infark miokard.
Uji Likelihood Ratio (G²) adalah alternatif dari uji chi-square yang digunakan untuk menguji hipotesis independensi dalam tabel kontingensi \(I \times J\). Statistik uji ini diberikan oleh:
\[ G^2 = 2 \sum_{i} \sum_{j} n_{ij} \ln \left( \frac{n_{ij}}{\hat{\mu}_{ij}} \right) \]
Dimana:
- \(n_{ij}\) adalah frekuensi observasi dalam tabel kontingensi.
\(\hat{\mu}_{ij} = n \cdot p_i \cdot p_j\) adalah frekuensi yang diharapkan.
\(p_i\) adalah proporsi untuk baris \(i\).
- \(p_j\) adalah proporsi untuk kolom \(j\).
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
Langkah 1: Hitung Frekuensi Ekspektasi
Gunakan rumus: \[ \hat{\mu}_{ij} = \frac{(\text{Total Baris}_i) \times (\text{Total Kolom}_j)}{\text{Grand Total}} \]
\[ \begin{aligned} \hat{\mu}_{11} &= \frac{1873 \times 144}{3213} = 83.94 \\ \hat{\mu}_{12} &= \frac{1873 \times 3019}{3213} = 1759.90 \\ \hat{\mu}_{21} &= \frac{1340 \times 144}{3213} = 60.05 \\ \hat{\mu}_{22} &= \frac{1340 \times 3019}{3213} = 1259.09 \\ \end{aligned} \]
Langkah 2: Hitung Statistik Uji G²
\[ \begin{aligned} G^2 &= 2 \sum O_{ij} \ln \left( \frac{O_{ij}}{E_{ij}} \right) \\ &= 2 \left[ 144 \ln \left( \frac{144}{83.94} \right) + 1729 \ln \left( \frac{1729}{1759.90} \right) + 50 \ln \left( \frac{50}{60.05} \right) + 1340 \ln \left( \frac{1340}{1259.09} \right) \right] \end{aligned} \]
Langkah 3: Bandingkan dengan Distribusi Chi-Square
Derajat bebas: \[ (I - 1)(J - 1) = (2 - 1)(2 - 1) = 1 \]
Nilai kritis \(\chi^2\) untuk \(\alpha = 0.05\) dan df = 1 adalah 3.841.
Karena \(G^2 = 0.26 < 3.841\), maka kita gagal menolak hipotesis nol, artinya tidak ada bukti yang cukup bahwa jenis terapi berpengaruh signifikan terhadap kontrol kanker.
Perhitungan dengan R
# Data Observasi
observed <- matrix(c(144, 1729,
20, 1290),
nrow = 2, byrow = TRUE)
# Menambahkan nama baris dan kolom
rownames(observed) <- c("Surgery", "Radiation Therapy")
colnames(observed) <- c("Cancer Controlled", "Cancer Not Controlled")
# Total per baris dan kolom
row_totals <- rowSums(observed)
col_totals <- colSums(observed)
grand_total <- sum(observed)
# Frekuensi harapan (Expected frequencies)
expected <- outer(row_totals, col_totals) / grand_total
# Hitung G²
G2 <- 2 * sum(observed * log(observed / expected), na.rm = TRUE)
# Derajat bebas
df <- (nrow(observed) - 1) * (ncol(observed) - 1)
# Nilai kritis chi-square
chi_critical <- qchisq(0.95, df)
# Output hasil
cat("Statistik G² =", round(G2, 3), "\n")
## Statistik G² = 69.687
cat("Derajat bebas =", df, "\n")
## Derajat bebas = 1
cat("Nilai kritis chi-square (0.05) =", round(chi_critical, 3), "\n")
## Nilai kritis chi-square (0.05) = 3.841
if (G2 > chi_critical) {
cat("Kesimpulan: Tolak H0 - Ada hubungan signifikan.\n")
} else {
cat("Kesimpulan: Gagal tolak H0 - Tidak ada hubungan signifikan.\n")
}
## Kesimpulan: Tolak H0 - Ada hubungan signifikan.
Bab ini mengulas secara mendalam mengenai analisis tabel kontingensi tiga arah, mencakup tabel parsial dan marginal, ukuran asosiasi, Paradox Simpson, independensi bersyarat, serta asosiasi homogen. Setiap topik dijelaskan dengan contoh perhitungan manual dan implementasi menggunakan R.
Tabel kontingensi tiga arah adalah perluasan dari tabel kontingensi dua arah, yang digunakan untuk menganalisis hubungan antara tiga variabel kategori secara bersamaan. Dalam banyak kasus, hubungan antara dua variabel (misalnya X dan Y) dapat dipengaruhi oleh variabel ketiga Z, yang berfungsi sebagai variabel kontrol atau kovariat. Tabel ini sangat berguna dalam analisis data yang melibatkan faktor pengganggu yang dapat memengaruhi hubungan antara dua variabel utama. Sebagai contoh:
Dalam penelitian epidemiologi, untuk mengkaji hubungan antara merokok (X) dan kanker paru-paru (Y), dengan mengendalikan pengaruh usia (Z).
Dalam riset sosial, untuk mengevaluasi hubungan antara ras tersangka (X) dan keputusan hukum berupa hukuman mati (Y), dengan mempertimbangkan kasus korban (Z)
Tabel kontingensi tiga arah dapat dibagi menjadi dua jenis:
Tabel Parsial: Tabel yang menunjukkan hubungan antara X dan Y pada setiap kategori Z, memungkinkan analisis hubungan bersyarat di mana pengaruh Z dikendalikan.
Tabel Marginal: Tabel yang diperoleh dengan mengabaikan Z, yaitu dengan menjumlahkan semua kategori Z. Tabel ini memberikan gambaran umum tentang hubungan antara X dan Y tanpa mempertimbangkan Z, yang dapat menyebabkan distorsi interpretasi, seperti yang terjadi dalam Paradox Simpson.
Manfaat Tabel Marginal
Tabel marginal digunakan untuk melihat pola asosiasi secara keseluruhan, namun sering kali mengabaikan efek dari kovariat yang dapat memberikan wawasan lebih mendalam. Oleh karena itu, analisis yang melibatkan tabel parsial biasanya lebih tepat untuk menghasilkan kesimpulan yang lebih akurat dalam penelitian ilmiah.
Tabel parsial adalah tabel yang mengelompokkan𝑋dan𝑌berdasarkan setiap level 𝑍, sedangkan tabel marginal adalah tabel yang mengabaikan𝑍,dengan menjumlahkan data dari semua level𝑍.
Contoh :
Tabel berikut menunjukkan data mengenai peristiwa pertama kali melakukan hubungan seksual pada remaja berusia 15 dan 16 tahun berdasarkan ras dan jenis kelamin.
\[ \begin{array}{|c|c|c|c|} \hline \textbf{Ras} & \textbf{Jenis Kelamin} & \textbf{Ya (Intercourse)} & \textbf{Tidak (No)} \\ \hline \text{Putih} & \text{Laki-laki} & 51 & 142 \\ \text{Putih} & \text{Perempuan} & 22 & 154 \\ \text{Hitam} & \text{Laki-laki} & 39 & 33 \\ \text{Hitam} & \text{Perempuan} & 31 & 43 \\ \hline \end{array} \]
Sumber: S. P. Morgan dan J. D. Tenchman, J.{Marriage Fam.} 50: 929–936 (1988). Dicetak kembali dengan izin dari National Council on Family Relations.
Manual
Tabel frekuensi parsial menyajikan hubungan antara dua variabel kategori dalam tabel kontingensi tiga arah dengan mempertimbangkan satu variabel sebagai kontrol. Tabel ini membantu dalam menambah hubungan bersyarat antara variabel dalam analisis data kategori.
Tabel Frekuensi Parsial untuk Z (Ras) = Putih: \[ \begin{array}{|c|c|c|} \hline \text{Jenis Kelamin} & \text{Ya (Intercourse)} & \text{Tidak (No)} \\ \hline \text{Laki-laki} & 51 & 142 \\ \text{Perempuan} & 22 & 154 \\ \hline \end{array} \]
Tabel Frekuensi Parsial untuk Z (Ras) = Putih menunjukkan hubungan antara jenis kelamin dan apakah individu tersebut sudah atau belum melakukan hubungan seksual.
Tabel Frekuensi Parsial untuk Z (Ras) = Hitam: \[ \begin{array}{|c|c|c|} \hline \text{Jenis Kelamin} & \text{Ya (Intercourse)} & \text{Tidak (No)} \\ \hline \text{Laki-laki} & 39 & 33 \\ \text{Perempuan} & 31 & 43 \\ \hline \end{array} \]
Tabel Frekuensi Parsial untuk Z (Ras) = Hitam menunjukkan hubungan antara jenis kelamin dan apakah individu tersebut sudah atau belum melakukan hubungan seksual pada kelompok ras Hitam.
Dengan R
# Membuat data dengan array
data3 <- array(
c(51, 22, 142, 154, 39, 31, 33, 43),
dim = c(2, 2, 2),
dimnames = list(
Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Intercourse = c("Ya", "Tidak"),
Ras = c("Putih", "Hitam")
)
)
# Tampilkan array untuk memastikan datanya
data3
## , , Ras = Putih
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 51 142
## Perempuan 22 154
##
## , , Ras = Hitam
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 39 33
## Perempuan 31 43
# Ekstrak tabel frekuensi parsial berdasarkan ras
freq_parsial_putih <- data3[, , "Putih"]
freq_parsial_hitam <- data3[, , "Hitam"]
# Tampilkan hasil frekuensi parsial
freq_parsial_putih
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 51 142
## Perempuan 22 154
freq_parsial_hitam
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 39 33
## Perempuan 31 43
Tabel frekuensi marginal menampilkan jumlah total observasi untuk setiap variabel dengan mengabaikan variabel lainnya dalam tabel kontingensi tiga arah. Tabel ini membantu dalam memahami distribusi kategori secara agregat tanpa mempertimbangkan hubungan antarvariabel. Tabel frekuensi marginal dihitung dengan menjumlahkan frekuensi dari tabel kontingensi tiga arah berdasarkan variabel yang tersisa.
Manual
abel Frekuensi Marginal untuk Race dan Intercourse
| Race | Yes | No | Total |
|---|---|---|---|
| White | 73 | 296 | 369 |
| Black | 70 | 76 | 146 |
| Total | 143 | 372 | 515 |
Tabel Frekuensi Marginal untuk Gender dan Intercourse
| Gender | Yes | No | Total |
|---|---|---|---|
| Male | 90 | 175 | 265 |
| Female | 53 | 197 | 250 |
| Total | 120 | 372 | 492 |
Dengan R
# Membuat data dengan array
data3 <- array(
c(51, 22, 142, 154, 39, 31, 33, 43),
dim = c(2, 2, 2),
dimnames = list(
Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Intercourse = c("Ya", "Tidak"),
Ras = c("Putih", "Hitam")
)
)
# Tampilkan array untuk memastikan datanya
data3
## , , Ras = Putih
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 51 142
## Perempuan 22 154
##
## , , Ras = Hitam
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 39 33
## Perempuan 31 43
# Ekstrak tabel frekuensi parsial berdasarkan ras
freq_marginal_X<-apply(data3,1,sum)
freq_marginal_Z<-apply(data3,3,sum)
# Tampilkan hasil frekuensi parsial
freq_marginal_X
## Laki-laki Perempuan
## 265 250
freq_marginal_Z
## Putih Hitam
## 369 146
Misalkan
Tabel berikut menunjukkan data mengenai peristiwa pertama kali melakukan hubungan seksual pada remaja berusia 15 dan 16 tahun berdasarkan ras dan jenis kelamin.
\[ \begin{array}{|c|c|c|c|} \hline \textbf{Ras} & \textbf{Jenis Kelamin} & \textbf{Ya (Intercourse)} & \textbf{Tidak (No)} \\ \hline \text{Putih} & \text{Laki-laki} & 51 & 142 \\ \text{Putih} & \text{Perempuan} & 22 & 154 \\ \text{Hitam} & \text{Laki-laki} & 39 & 33 \\ \text{Hitam} & \text{Perempuan} & 31 & 43 \\ \hline \end{array} \]
Sumber: S. P. Morgan dan J. D. Tenchman, J.{Marriage Fam.} 50: 929–936 (1988). Dicetak kembali dengan izin dari National Council on Family Relations.
Peluan bersama didefinisikan sebagai:
\[ P(Z, X, Y) = \frac{f(Z, X, Y)}{N} \] Contoh Perhitungan dengan Data diatas
# Load library yang diperlukan
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
# Data dalam format array 3D
data <- array(
c(51, 22, 142, 154, # Putih
39, 31, 33, 43), # Hitam
dim = c(2, 2, 2),
dimnames = list(
"Jenis Kelamin" = c("Lelaki", "Perempuan"),
"Intercouse" = c("Ya", "Tidak"),
"Ras" = c("Putih", "Hitam")
)
)
# Menampilkan tabel
print(data)
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 51 142
## Perempuan 22 154
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 39 33
## Perempuan 31 43
total <- sum(data)
joint_prob <- data/ total
ftable(joint_prob)
## Ras Putih Hitam
## Jenis Kelamin Intercouse
## Lelaki Ya 0.09902913 0.07572816
## Tidak 0.27572816 0.06407767
## Perempuan Ya 0.04271845 0.06019417
## Tidak 0.29902913 0.08349515
Intepretasi : Pria yang tidak berhubungan seksual cenderung lebih banyak berkulit putih dibandingkan dengan kulit hitam, sedangkan wanita yang tidak berhubungan seksual cenderung lebih banyak berkulit putih juga.
Peluang marginal didefinisikan sebagai berikut
untuk Ras: \[ P(Z) = \frac{n(Z)}{N} \]
marginal_Z <- apply(joint_prob, 3, sum)
marginal_Z
## Putih Hitam
## 0.7165049 0.2834951
Intepretasi : Proporsi Ras Putih lebih banyak dibanding ras Hitam.
Untuk Gender: \[ P(X) = \frac{n(X)}{N} \]
marginal_X <- apply(joint_prob, 1, sum)
marginal_X
## Lelaki Perempuan
## 0.5145631 0.4854369
Intepretasi : Proporsi perempuan lebih banyak dibanding laki - laki
Contoh : Mencari peluang seseorang ber - ras tertentu jika ia laki - laki dan melakukan hubungan seksual: \[ P(Ras| X = Laki-laki,Y=1) = \frac{P(Ras,Laki-laki,Y=1)}{P(X=Laki - laki,Y=1)} \]
p_Z_given_X_Y <- prop.table(data, margin = c(1,2))
p_Z_given_X_Y
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 0.5666667 0.8114286
## Perempuan 0.4150943 0.7817259
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 0.4333333 0.1885714
## Perempuan 0.5849057 0.2182741
Intepretasi : Peluang seseorang memiliki ras putih ketika ia laki - laki dan melakukan hubungan seksual adalah 0.597. Dan peluang seseorang memiliki ras hitam ketika ia laki - laki dan melakukan hubungan seksual adalah 0.403
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
# Hitung RD untuk masing-masing ras
rd_putih <- (data["Lelaki", "Ya", "Putih"] / sum(data["Lelaki", , "Putih"])) -
(data["Perempuan", "Ya", "Putih"] / sum(data["Perempuan", , "Putih"]))
rd_hitam <- (data["Lelaki", "Ya", "Hitam"] / sum(data["Lelaki", , "Hitam"])) -
(data["Perempuan", "Ya", "Hitam"] / sum(data["Perempuan", , "Hitam"]))
rd_putih
## [1] 0.1392487
rd_hitam
## [1] 0.1227477
Intepretasi : Perbedaan peluang (RD) menunjukkan bahwa laki - laki meningkatkan potensi untuk melakukan hubungan seksual sekitar 0.0943 (9.4%) untuk ras putih dan sekitar 0.178382 untuk ras hitam.
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
#Menghitung RR untuk masing masing ras
rr_putih <- (data["Lelaki", "Ya", "Putih"] / sum(data["Lelaki", , "Putih"])) /
(data["Perempuan", "Ya", "Putih"] / sum(data["Perempuan", , "Putih"]))
rr_hitam <- (data["Lelaki", "Ya", "Hitam"] / sum(data["Lelaki", , "Hitam"])) /
(data["Perempuan", "Ya", "Hitam"] / sum(data["Perempuan", , "Hitam"]))
rr_putih
## [1] 2.11399
rr_hitam
## [1] 1.293011
Intepretasi : Risiko relatif (RR) menunjukkan bahwa laki - laki memiliki 1.5 kali lipat potensi melakukan hubungan seksual dibandingkan perempuan untuk ras putih , dan 1.47 kali lipat untuk ras hitam.
\[ OR = \frac{a \cdot d}{b \cdot c} \]
# Menghitung Odds Ratio untuk masing masing ras
or_putih <- (data["Lelaki", "Ya", "Putih"] / data["Lelaki", "Tidak", "Putih"]) /
(data["Perempuan", "Ya", "Putih"] / data["Perempuan", "Tidak", "Putih"])
or_hitam <- (data["Lelaki", "Ya", "Hitam"] / data["Lelaki", "Tidak", "Hitam"]) /
(data["Perempuan", "Ya", "Hitam"] / data["Perempuan", "Tidak", "Hitam"])
or_putih
## [1] 2.514085
or_hitam
## [1] 1.639296
Intepretasi : Odds Ratio (OR) menunjukkan bahwa peluang melakukan hubungan seksual bagi laki - laki 1.83 kali lebih tinggi pada ras putih dan 2.063 kali lebih tinggi pada ras hitam dibandingkan perempuan.
Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan antara dua variabel kategorik dengan mempertimbangkan variabel kontrol.Contohnya adalah hubungan antara Gender (X) dan Perilaku melakukan hubungan seksual pertama kali di umur 16-17 tahun (Y) dengan variabel kontrol ras (Z).
Tabel ini terdiri dari beberapa tabel parsial (2×2) untuk setiap tingkat Z, serta tabel marginal yang mengabaikan Z. Ukuran asosiasi yang digunakan adalah odds ratio.
Jika odds ratio parsial relatif konstan, kita dapat menghitung odds ratio bersama menggunakan estimasi Mantel-Haenszel.
Independensi bersyarat adalah konsep penting dalam analisis tabel kontingensi tiga arah. Ini merujuk pada kondisi di mana dua variabel, 𝑋 dan 𝑌, independen dalam setiap level variabel ketiga, 𝑍. Pengujian independensi bersyarat dilakukan dengan metode statistik seperti uji Cochran-Mantel-Haenszel (CMH).
Definisi Independensi Bersyarat
Independensi Bersyarat: Dua variabel, 𝑋 dan 𝑌, dikatakan independen bersyarat terhadap variabel ketiga, 𝑍, jika rasio odds mereka dalam setiap strata 𝑍 sama dengan 1.
Metode Cochran-Mantel-Haenszel Tujuan Uji CMH Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji hubungan antara dua variabel kategori dengan mempertimbangkan efek dari variabel perancu (confounder).
Statistik uji Cochran-Mantel-Haenszel (CMH) dirumuskan sebagai:
\[ CMH = \frac{\sum_k \left( n_{1ik} - \mu_{1ik} \right)^2}{\sum_k \text{var}(n_{1ik})} \]
Keterangan
\[ \mu_{1ik} = E(n_{1ik}) = \frac{n_{1.k} \cdot n_{1ik}}{n_{.k}} \]
Varians dari \(n_{1ik}\) diberikan oleh:
\[ \text{var}(n_{1ik}) = \frac{n_{1.k} \cdot n_{2.k} \cdot n_{1ik} \cdot n_{2.k}}{n_{2.k}^2 \cdot (n_{.k} - 1)} \]
Contoh 1
Misalkan kita memiliki data mengenai efek merokok terhadap kanker paru-paru, tetapi ingin mengontrol faktor jenis kelamin. Data dikategorikan menjadi laki-laki dan perempuan dengan tabel 2×2 masing-masing:
Tabel Kontingensi
Ras: Putih
\[ \begin{array}{|c|c|c|c|} \hline & \text{Intercourse (Ya)} & \text{Intercourse (tidak)} & \text{Total} \\ \hline \text{Laki-laki} & 51 & 142 & 193 \\ \text{Perempuan} & 22 & 154 & 176 \\ \hline \end{array} \]
Ras: Hitam
\[ \begin{array}{|c|c|c|c|} \hline & \text{Intercourse (Ya)} & \text{Intercourse (tidak)} & \text{Total} \\ \hline \text{Laki - laki} & 39 & 33 & 72 \\ \text{Perempuan} & 31 & 43 & 74 \\ \hline \end{array} \]
Perhitungan manual
Rumus nilai harapan \(\mu_{1ik}\) untuk setiap strata \(k\):
\[ \mu_{1ik} = \frac{(n_{i+k} \times n_{+ik})}{n_{++k}} \]
Di mana: - \(n_{i+k}\) = Total laki - laki dalam strata \(k\) - \(n_{+ik}\) = Total Intercourse dalam strata \(k\) - \(n_{++k}\) = Total individu dalam strata \(k\)
Untuk Ras Putih (k=1):
\[ \mu_{111} = \frac{(193 \times 73)}{369} = 38.181 \]
Untuk Ras Hitam (k=2):
\[ \mu_{112} = \frac{(72 \times 70)}{146} = 34.520 \]
Rumus varians:
\[ \text{Var}(n_{1ik}) = \frac{n_{i+k} \times n_{0+k} \times n_{+ik} \times n_{+0k}}{n_{++k}^2 \times (n_{++k} - 1)} \]
Untuk Ras Putih (k=1):
\[ \text{Var}(n_{111}) = \frac{(193 \times 142 \times 51 \times 154)}{352^2 \times (352 - 1)} = 13.91 \]
Untuk Ras Hitam (k=2):
\[ \text{Var}(n_{112}) = \frac{(175 \times 149 \times 26 \times 134)}{350^2 \times (350 - 1)} = 9.91 \]
Rumus statistik CMH:
\[ X^2_{CMH} = \frac{\sum_k (n_{1ik} - \mu_{1ik})^2}{\sum_k \text{Var}(n_{1ik})} \]
\[ X^2_{CMH} = \frac{((43 - 34.696) + (29 - 24.109))^2}{13.91 + 9.91} = 7.309 \]
Intepretasi : Misalkan dengan taraf signifikansi 5%, maka kita memiliki nilai kritis sebesar 3.841. Dikarenakan 7.309 > 3.841 maka hipotesis nol ditolak yang berarti terdapat hubungan signifikan antara jenis kelamin terhadap perlakuan intercourse setelah mengontrol variabel ras.
Perhitungan dengan R
data_cmh <- array(
c(51, 22, 142, 154, # Putih
39, 31, 33, 43), # Hitam
dim = c(2, 2, 2),
dimnames = list(
"Jenis Kelamin" = c("Lelaki", "Perempuan"),
"Intercouse" = c("Ya", "Tidak"),
"Ras" = c("Putih", "Hitam")
)
)
# Menampilkan tabel
print(data_cmh)
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 51 142
## Perempuan 22 154
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 39 33
## Perempuan 31 43
cmh_base <- mantelhaen.test(data_cmh, correct = TRUE)
cmh_base
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data_cmh
## Mantel-Haenszel X-squared = 11.846, df = 1, p-value = 0.0005777
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.393672 3.218603
## sample estimates:
## common odds ratio
## 2.117942
Intepretasi : Dikarenakan p value 0.003804 < 0.05 maka keputusannya adalah menolak H0 yang berarti terdapat hubungan signifikan antara jenis kelamin terhadap perlakuan intercourse setelah mengontrol variabel ras.
Model Linier Generalisasi (GLM) adalah suatu perpanjangan dari model regresi linier klasik. GLM memungkinkan pemodelan data di mana variabel respons tidak terdistribusi normal atau hubungan antara variabel prediktor dan rata-rata variabel respons tidak bersifat linear. GLM terdiri dari tiga komponen utama:
Distribusi dari keluarga eksponensial untuk variabel respons: Ini merujuk pada distribusi yang lebih umum dari variabel respons yang dapat digunakan dalam GLM, seperti distribusi binomial, Poisson, normal, dan lainnya.
Fungsi link: Fungsi ini menghubungkan ekspektasi dari variabel respons dengan kombinasi linier dari variabel prediktor. Fungsi link memungkinkan kita untuk mentransformasikan ekspektasi dari variabel respons agar lebih cocok dengan bentuk distribusi yang digunakan.
Fungsi linear prediktor: Fungsi ini adalah kombinasi linier dari variabel prediktor, yang sering dinyatakan dalam bentuk η=Xβ= X=Xβ, di mana XXX adalah matriks dari variabel prediktor dan βadalah vektor parameter yang ingin dipelajari.
Distribusi termasuk dalam exponential family jika dapat ditulis dalam bentuk:
\[ f(y; \theta, \phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Contoh Distribusi yang Termasuk Exponential Family:
Contoh Pembuktian: Distribusi Binomial
Fungsi probabilitas distribusi binomial adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
Tuliskan ulang dalam bentuk exponential family:
\[ P(Y = y) = \exp \left\{ \log \binom{n}{y} + y \log \left( \frac{\pi}{1 - \pi} \right) + n \log (1 - \pi) \right\} \]
Dengan substitusi:
Kesimpulan : Dengan bentuk tersebut, maka distribusi binomial termasuk dalam keluarga exponential family.
Regresi Logistik mirip dengan regresi linear karena keduanya menggabungkan nilai input secara linear dengan koefisien (bobot) untuk menghasilkan prediksi. Perbedaannya, regresi logistik membatasi hasil prediksi pada nilai biner 0 atau 1 dengan menggunakan fungsi sigmoid sebagai fungsi aktivasi. Fungsi ini mengubah output menjadi nilai antara 0 dan 1 serta membentuk kurva berbentuk huruf S.
Model regresi logistik digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen dan mengklasifikasikan data ke dalam kategori diskrit. Artinya, regresi logistik sangat cocok untuk masalah klasifikasi, terutama yang hanya memiliki dua kategori (klasifikasi biner).
Contohnya, angka 0 bisa mewakili kegagalan, sementara angka 1 menunjukkan keberhasilan.
Beberapa contoh penerapan regresi logistik dalam klasifikasi biner meliputi:
Prediksi kelulusan siswa: Regresi logistik dapat digunakan untuk memprediksi apakah seorang siswa akan lulus atau tidak berdasarkan variabel seperti kehadiran, nilai tugas, partisipasi kelas, dan nilai ujian.
Deteksi penipuan transaksi keuangan: Dalam perbankan dan keuangan, regresi logistik membantu mendeteksi apakah transaksi normal atau mencurigakan (fraud), dengan menganalisis pola transaksi seperti frekuensi, jumlah uang, lokasi, dan waktu.
Prediksi hasil diagnosis penyakit: Dalam medis, model ini bisa digunakan untuk menentukan apakah seorang pasien menderita penyakit tertentu (seperti diabetes atau kanker) berdasarkan faktor-faktor seperti usia, tekanan darah, kadar gula, dan riwayat keluarga
Keunggulan utama dari regresi logistik adalah kemudahan penerapannya dalam Machine Learning. Regresi logistik sangat mudah diterapkan dalam Machine Learning karena proses pelatihan dan pengujian cukup sederhana. Model ini belajar dari pola-pola dalam data input dan menghubungkannya dengan output (label). Selain itu, karena tidak memerlukan komputasi yang tinggi, regresi logistik mudah diimplementasikan, dipahami, dan dilatih dibandingkan dengan metode lain dalam Machine Learning.
Regresi logistik juga efektif untuk data yang dapat dipisahkan secara linear. Jika dua kelas data dapat dipisahkan dengan garis lurus, regresi logistik akan sangat baik dalam mengklasifikasikan data tersebut ke dalam dua kelompok yang berbeda. Dalam hal ini, variabel target (y) hanya memiliki dua nilai, sehingga model dapat menentukan batas yang jelas antara keduanya.
Model ini juga memberikan wawasan yang berarti, karena dapat menunjukkan seberapa besar pengaruh suatu variabel terhadap hasil akhir, melalui koefisien yang dihasilkan. Selain itu, model ini juga mengindikasikan apakah hubungan antar variabel bersifat positif atau negatif.
Persamaan dan asumsi dalam regresi logistik: Model ini menggunakan fungsi sigmoid, sebuah fungsi matematika berbentuk kurva S yang mengubah nilai output menjadi rentang antara 0 dan 1. Jika hasil dari fungsi sigmoid (yang merepresentasikan probabilitas) lebih besar dari ambang batas tertentu, maka model akan mengklasifikasikan data ke dalam kelas tertentu. Sebaliknya, jika probabilitas tersebut lebih kecil dari ambang batas, maka model akan mengklasifikasikan data sebagai bukan bagian dari kelas tersebut.
Sebagai contoh:
-Jika hasil fungsi sigmoid lebih dari 0,5, maka output dianggap sebagai 1 (kelas positif). -Jika hasilnya kurang dari 0,5, maka output diklasifikasikan sebagai 0 (kelas negatif). -Jika grafik menuju ke arah negatif secara ekstrem, maka nilai prediksi y akan menjadi 0,dan sebaliknya.
Fungsi sigmoid digunakan dalam regresi logistik untuk mengubah nilai prediksi menjadi probabilitas. Rumus dari fungsi sigmoid yaitu: \[ f(x) = \frac{1}{1 + e^{-x}} \]
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 100
x <- seq(-4, 4, length.out = n)
log_odds <- -0.5 + 1.5 * x
prob <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, prob)
# Buat data frame
data <- data.frame(x=x, y=y, prob = prob)
Plot Kurva Sigmoid
# Visualisasi menggunakan base R plot
# Visualisasi menggunakan base R
# Plot the data
plot(x, y,
pch = 16,
col = "gray60",
xlab = "X",
ylab = "Y / Probabilitas",
main = "Simulasi Regresi Logistik dengan Kurva Sigmoid")
lines(x, prob, col = "blue", lwd = 2)
abline(h = 0.5, col = "red", lty = 2)
legend("topleft", legend = c("Data Biner (0/1)", "Kurva Logistik", "Ambang 0.5"),
col = c("gray60", "blue", "red"),
pch = c(16, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 2, 1),
pt.cex = 1.5, bty = "n")
Kurva sigmoid dalam regresi logistik menunjukkan hubungan non-linear antaravariabel prediktor dan probabilitas output. Pendekatan ini efektif untuk klasifikasi biner seperti deteksi penyakit, kelulusan siswa, dan prediksi ya/tidak.
Fungsi Link (Logit): Fungsi link logit dapat dinyatakan dalam bentuk berikut:
\[ g(\mu) = \log \left( \frac{\mu}{1 - \mu} \right) \]
Model Regresi Logistik:
\[ \log \left( \frac{\mu}{1 - \mu} \right) = X\beta \]
Fungsi Inverse Link:
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Estimasi Parameter
Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE).
Log-likelihood fungsi untuk regresi logistik:
\[ l(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] Dengan:
\[ \pi_i = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Contoh Kasus dengan R
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
| Cancer Controlled | Cancer Not Controlled | Total | |
|---|---|---|---|
| Surgery | 144 | 1729 | 1873 |
| Radiation Therapy | 50 | 1290 | 1340 |
| Total | 194 | 3019 | 3213 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (144), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (50), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
# Tampilkan data
head(data)
Estimasi Regresi Logistik Estimasi parameter model regresi logistik dapat menggunakan ‘glm’ function
model <- glm(CancerControlled ~ Treatment, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.2504 0.1441 -22.551 < 2e-16 ***
## Treatment 0.7649 0.1682 4.547 5.44e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1465.2 on 3212 degrees of freedom
## Residual deviance: 1442.4 on 3211 degrees of freedom
## AIC: 1446.4
##
## Number of Fisher Scoring iterations: 6
Interpretasi Koefisien
• Intercept ((Intercept)): nilai log-odds saat x=0
• Koefisien x: perubahan log-odds untuk setiap satu satuan peningkatan pada x
• Nilai p: menunjukkan signifikansi statistik dari prediktor
Koefisien log-odds dapat ditransformasikan ke odds ratio:
exp(coef(model))
## (Intercept) Treatment
## 0.03875969 2.14875651
Prediksi dan Visualisasi Kurva Logit
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
data$pred <- predict(model, type = "response")
ggplot(data, aes(x=Treatment, y=CancerControlled)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y=pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Logistik",
x="X (Prediktor)",
y="Probabilitas / Respons") +
theme_minimal()
GLM adalah kerangka model fleksibel untuk berbagai jenis data dan distribusi. Regresi logistik merupakan salah satu contoh penting dari GLM, sangat berguna dalam analisis data kategorik biner. Estimasi parameter dilakukan melalui metode MLE dan dapat diselesaikan secara efisien dengan fungsi glm di R.
Regresi Poisson digunakan ketika variabel respons adalah data cacah (count data),yaitu bilangan bulat non negatif. Model ini merupakan bagian dari Generalized Linear Model(GLM) dengan asumsi bahwa distribusi variabel respons adalah distribusi Poisson.
Distribusi Poisson memiliki fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Distribusi Poisson dapat dituliskan dalam bentuk exponential family sebagai berikut:
\[ f(y; \theta) = \exp \left\{ y \log(\lambda) - \lambda - \log(y!) \right\} \]
dengan:
Maka distribusi Poisson termasuk dalam exponential family.
Fungsi Link
Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
Sehingga modelnya menjadi:
\[ \log(\mu_i) = x_i^T \beta \]
dan fungsi inverse link:
\[ \mu_i = \exp(x_i^T \beta) \]
Estimasi Parameter
Estimasi parameter \(( \beta )\)
dilakukan dengan metode Maximum Likelihood Estimation
(MLE).
Log-likelihood fungsi untuk regresi Poisson:
\[ l(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - \exp(x_i^T \beta) - \log(y_i!) \right] \]
Nilai \(( \beta )\) dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.
Contoh:
Misalkan kita memiliki data sebagai berikut:
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (144), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (50), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
# Tampilkan data
head(data)
lambda <- exp(0.3 + 0.6 * data$Treatment)
Estimasi Regresi Poisson
poisson_model <- glm(CancerControlled ~ Treatment, data = data, family = poisson())
summary(poisson_model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = poisson(),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.2884 0.1414 -23.253 < 2e-16 ***
## Treatment 0.7229 0.1641 4.404 1.06e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1089.2 on 3212 degrees of freedom
## Residual deviance: 1067.7 on 3211 degrees of freedom
## AIC: 1459.7
##
## Number of Fisher Scoring iterations: 6
Plot Hasil Prediksi
plot(data$Treatment, data$CancerControlled, pch = 16, col = "darkgray", main = "Data dan Hasil Prediksi")
newdata <- data.frame(Treatment=seq(min(data$Treatment), max(data$Treatment), length.out = 100))
pred <- predict(poisson_model, newdata = newdata, type = "response")
lines(newdata$Treatment, pred, col = "blue", lwd = 2)
Diagnostik dan Overdispersion
Salah satu asumsi penting dari model Poisson adalah bahwa mean dan varians dari variabel respons adalah sama (𝐸[𝑌]=𝑉𝑎𝑟[𝑌]). Jika varians lebih besar dari mean, maka terjadi overdispersion. Untuk mendeteksi overdispersion:
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 0.9402055
Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan.
exp(coef(poisson_model))
## (Intercept) Treatment
## 0.03731343 2.06043780
Visualisasi Prediksi
data$predicted <- predict(poisson_model, type = "response")
library(ggplot2)
ggplot(data, aes(x=data$Treatment, y=data$CancerControlled)) +
geom_jitter(width = 0.2, alpha = 0.6) +
geom_point(aes(CancerControlled=predicted), shape = 18, size = 3, color = "black") +
labs(title = "Prediksi", x="Treatment", y="CancerControlled") +
theme_minimal()
## Warning in geom_point(aes(CancerControlled = predicted), shape = 18, size = 3,
## : Ignoring unknown aesthetics: CancerControlled
## Warning: Use of `data$Treatment` is discouraged.
## ℹ Use `Treatment` instead.
## Warning: Use of `data$CancerControlled` is discouraged.
## ℹ Use `CancerControlled` instead.
## Warning: Use of `data$Treatment` is discouraged.
## ℹ Use `Treatment` instead.
## Warning: Use of `data$CancerControlled` is discouraged.
## ℹ Use `CancerControlled` instead.
Evaluasi Model
# Plot residuals
plot(poisson_model$residuals,
main = "Residual Plot",
ylab = "Residual",
xlab = "Index",
pch = 19,
col = "steelblue")
abline(h = 0, col = "red", lty = 2)
Dalam Generalized Linear Model (GLM), inferensi statistik membutuhkan pemahaman terhadap ekspektasi dan variansi dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.
Ekspektasi dan Varians dalam GLM
Ekspektasi menunjukkan apakah suatu estimator tak bias, yaitu:
\[ \mathbb{E}[\hat{\beta}] = \beta \]
Dalam GLM, MLE dari \(\hat{\beta}\) bersifat asymptotically unbiased.
Varians menunjukkan presisi dari estimasi parameter:
\[ \text{Var}(\hat{\beta}) \approx (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]
dimana \(\mathbf{W}\) adalah matriks bobot yang tergantung pada distribusi dan fungsi link.
Distribusi Asimptotik Estimator
Dengan ukuran sampel besar:
\[ \hat{\beta} \sim \mathcal{N}(\beta, \text{Var}(\hat{\beta})) \]
Distribusi ini adalah dasar dari:
Varians dalam GLM Tidak Konstan
Tidak seperti regresi linear (OLS) yang mengasumsikan homoskedastisitas:
\[ \text{Var}(Y_i) = \sigma^2 \]
Dalam GLM:
\[ \text{Var}(Y_i) = \phi V(\mu_i) \]
Contoh:
Contoh Regresi Poisson
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (144), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (50), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
# Tampilkan data
head(data)
# Ringkasan model regresi Poisson
model <- glm(CancerControlled ~ Treatment, data = data, family = poisson())
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = poisson(),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.2884 0.1414 -23.253 < 2e-16 ***
## Treatment 0.7229 0.1641 4.404 1.06e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1089.2 on 3212 degrees of freedom
## Residual deviance: 1067.7 on 3211 degrees of freedom
## AIC: 1459.7
##
## Number of Fisher Scoring iterations: 6
Kesimpulan:
## 9.1 Mencari Ekspektasi dan Varians dalam GLM
Ekspektasi
Jika diturunkan berdasarkan fungsi momen:
\[ E(Y) = \int y f(y; \theta) \, dy = \mu \]
Untuk keluarga eksponensial:
\[ \log f(y; \theta) = a(y) + b(\theta) y + c(\theta) \]
atau:
\[ \log f(y; \theta) = y \theta - b(\theta) + c(y) \]
Maka ekspektasi turunan pertama:
\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \] Dan ekspektasi turunan pertama:
\[ \mathbb{E}[U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
Maka:
\[ \mu = b'(\theta) \]
Varians
Turunan kedua:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
Sehingga:
\[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) \]
Maximum Likelihood Estimation (MLE)
Namun, karena bentuk GLM tidak eksplisit, digunakan metode numerik.
Metode Optimisasi: Newton-Raphson
Iterasi:
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \] Fisher Scoring
IRLS (Iteratively Reweighted Least Square) - Modifikasi dari Fisher scoring, hasil estimasi mirip dengan Least Square.
Implementasi Newton-Raphson Statistik score ke-𝑗 Statistik score ke-𝑗:
\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \] Turunan kedua:
\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]
Taylor expansion:
\[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
Estimasi parameter:
\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Diagnostik digunakan untuk mengevaluasi apakah model sudah tepat.
Statistik Devians
\[ D = 2 \sum \left[ y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i) \right] \]
Statistik Chi-Kuadrat Pearson
\[ X^2 = \sum \left( \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \right) \] • Jika signifikan → model lebih baik daripada tanpa model.
Catatan
• Untuk data yang dikelompokkan, statistik devians dan chi-kuadrat Pearson mengikuti distribusi ChiSquare.
• Untuk data tidak dikelompokkan, tidak mengikuti distribusi Chi-Square.
• Devians diminimalkan oleh MLE → cocok digunakan untuk evaluasi model.
Analisis Residual
• Residual adalah selisih antara observasi dengan prediksi.
• Dapat digunakan untuk memeriksa penyimpangan sistematis.
• Dapat diplot untuk menilai asumsi model
Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.
Fungsi model logistik:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] Estimasi dengan Newton-Raphson
Metode Newton-Raphson digunakan untuk mencari nilai parameter \(( \beta )\) yang memaksimalkan fungsi log-likelihood pada model regresi logistik.
Fungsi Log-Likelihood
Model regresi logistik untuk probabilitas:
\[ \pi_i = \frac{1}{1 + \exp(-x_i^\top \beta)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Langkah-langkah Newton-Raphson Turunan dalam Estimasi Logistik
\[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi) \]
\[ H(\beta) = -X^\top W X, \quad \text{dengan } W = \text{diag}(\pi_i (1 - \pi_i)) \]
\[ \beta^{(t+1)} = \beta^{(t)} + (X^\top W^{(t)} X)^{-1} X^\top (y - \pi^{(t)}) \]
Estimasi MLE dengan Newton-Raphson (Manual di R)
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (144), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (50), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
# Tampilkan data
head(data)
beta_true <- c(-1, 2)
X <- cbind(1, data$Treatment)
eta <- X %*% beta_true
p <- 1 / (1 + exp(-eta))
Newton-Raphson Iterasi Manual
# Inisialisasi
beta <- matrix(0, ncol = 1, nrow = ncol(X))
tol <- 1e-6
max_iter <- 100
# Iterasi Newton-Raphson
for (i in 1:max_iter) {
eta <- X %*% beta
pi_hat <- 1 / (1 + exp(-eta))
W <- diag(as.vector(pi_hat * (1 - pi_hat)))
z <- eta + (data$CancerControlled- pi_hat) / (pi_hat * (1 - pi_hat))
beta_new <- solve(t(X) %*% W %*% X) %*% (t(X) %*% W %*% z)
if (sum(abs(beta_new - beta)) < tol) break
beta <- beta_new
}
# Hasil akhir
beta
## [,1]
## [1,] -3.2503745
## [2,] 0.7648893
• Estimasi parameter pada model regresi logistik dilakukan dengan MLE. • Newton-Raphson adalah metode numerik yang digunakan untuk memaksimalkan log-likelihood.
• Iterasi didasarkan pada turunan pertama (score) dan kedua (Hessian).
• Prosedur identik dengan IRLS (Iteratively Reweighted Least Squares) dalam implementasi GLM.
Inferensi Parameter
Tujuan Uji Wald
Untuk menguji signifikansi parameter \((
\beta_j )\) dalam model regresi logistik:
Teori Wald Test
Dari teori estimasi MLE, estimator \((
\hat{\beta}_j )\) mendekati distribusi normal:
\[ \hat{\beta}_j \sim N(\beta_j, \text{Var}(\hat{\beta}_j)) \]
Jika \(( H_0 )\) benar (yaitu \(( \beta_j = 0 )\)), maka:
\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]
Dengan Statistik Wald:
\[ W = Z^2 = \left( \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \right)^2 \sim \chi^2_1 \]
Uji Wald Langkah demi Langkah
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
log_odds <- -0.5 + 1.2 * data$Treatment
p <- 1 / (1 + exp(-log_odds))
model <- glm(CancerControlled ~ Treatment, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.2504 0.1441 -22.551 < 2e-16 ***
## Treatment 0.7649 0.1682 4.547 5.44e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1465.2 on 3212 degrees of freedom
## Residual deviance: 1442.4 on 3211 degrees of freedom
## AIC: 1446.4
##
## Number of Fisher Scoring iterations: 6
Langkah 1: Ambil nilai koefisien dan standard error (SE)
beta_hat <- coef(model)["Treatment"]
se_beta <- summary(model)$coefficients["Treatment", "Std. Error"]
Langkah 2: Hitung Statistik Z
Z <- beta_hat / se_beta
Z
## Treatment
## 4.546956
Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2
Wald_stat
## Treatment
## 20.67481
Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
## Treatment
## 5.442747e-06
Interpretasi
• Jika p-value < 0.05, maka koefisien signifikan → variabel prediktor berpengaruh.
• Jika p-value > 0.05, maka tidak ada cukup bukti untuk menolak - \(( H_0 )\)
Kesimpulan
Uji Wald didasarkan pada rasio antara estimasi parameter dan standar error-nya. Dengan menaikkan nilai Z menjadi kuadrat (Z²), kita memperoleh distribusi Chi-Square untuk pengujian hipotesis parameter individual dalam model regresi logistik
Bandingkan model penuh dengan model tanpa prediktor
# Model null
model_null <- glm(CancerControlled ~ 1, data = data, family = binomial)
# Likelihood ratio test
anova(model_null, model, test = "Chisq")
Evaluasi Kebaikan Model
Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 1446.444
Alternatif terhadap AIC, menghukum kompleksitas model.
BIC(model)
## [1] 1458.594
• Estimasi regresi logistik dilakukan dengan MLE melalui iterasi Newton-Raphson.
• Inferensi parameter dapat dilakukan dengan uji Wald dan likelihood ratio (uji Chi-Square).
• AIC dan BIC digunakan untuk mengevaluasi kompleksitas dan kecocokan model.
Model regresi Poisson digunakan untuk memodelkan data count (jumlah kejadian) dimana variabel respons mengikuti distribusi Poisson. Estimasi dilakukan dengan Maximum Likelihood Estimation (MLE), dan inferensi dilakukan dengan uji Wald dan Likelihood Ratio Test.
Model Regresi Poisson
Distribusi Poisson:
\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
Model regresi Poisson:
\[ \log(\lambda_i) = x_i^T \beta \] Estimasi Parameter (MLE)
Log-likelihood fungsi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Dengan:
\[ \lambda_i = \exp(x_i^T \beta) \]
Estimasi dilakukan dengan metode iterasi (IRLS)
Estimasi parameter model regresi Poisson menggunakan pendekatan
Maximum Likelihood Estimation (MLE) dengan metode
Iteratively Reweighted Least Squares (IRLS) secara
manual, tanpa menggunakan glm().
Tahap 1: Definisikan Model Regresi Poisson
\[ \log(\lambda_i) = x_i^T \beta \quad \Rightarrow \quad \lambda_i = \exp(x_i^T \beta) \]
Tahap 2: Mencari Log-likelihood yang dimaksimumkan
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \] Tahap 3: Formulasi iteratif:
\[ \beta^{(t+1)} = \left( \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{X} \right)^{-1} \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{z}^{(t)} \]
Dengan:
dan
\[ \eta_i = \log(\lambda_i) = x_i^T \beta \] Simulasi Data
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 144), rep(1, 1729), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 50), rep(0, 1290)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 144), rep(0, 1729),
rep(1, 50), rep(0, 1290))
)
X <- cbind(1, data$Treatment) # Tambah intercept
beta_true <- c(0.5, 0.8)
eta <- X %*% beta_true
lambda <- exp(eta)
IRLS Manual Step-by-Step
# Inisialisasi
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- exp(eta)
W <- diag(as.numeric(lambda))
z <- eta + (data$CancerControlled - lambda) / lambda
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 8
beta # hasil estimasi
## [,1]
## [1,] -3.2884019
## [2,] 0.7229185
Perbandingan dengan glm
model_glm <- glm(data$CancerControlled ~ data$Treatment, family = poisson())
summary(model_glm)
##
## Call:
## glm(formula = data$CancerControlled ~ data$Treatment, family = poisson())
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.2884 0.1414 -23.253 < 2e-16 ***
## data$Treatment 0.7229 0.1641 4.404 1.06e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1089.2 on 3212 degrees of freedom
## Residual deviance: 1067.7 on 3211 degrees of freedom
## AIC: 1459.7
##
## Number of Fisher Scoring iterations: 6
• IRLS memberikan cara iteratif untuk menghitung estimasi MLE dalam regresi Poisson.
• Hasil manual IRLS sangat mendekati hasil glm() dari R.
• Metode ini memberikan pemahaman mendalam atas mekanisme di balik fungsi glm().
Pengujian hipotesis Uji Wald
Untuk menguji H0: = 0
# Koefisien dan standar error
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1 - pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 4.546956
## Chi-Square: 20.67481
## p-value: 5.442747e-06
Uji Likelihood Ratio (Chi-Square)
model_null <- glm(data$CancerControlled ~ 1, family = poisson(), data = data)
anova(model_null, model, test = "Chisq")
## Warning in anova.glmlist(c(list(object), dotargs), dispersion = dispersion, :
## models with response '"CancerControlled"' removed because response differs from
## model 1
Evaluasi Model (AIC & BIC)
AIC(model)
## [1] 1446.444
BIC(model)
## [1] 1458.594
• Estimasi parameter regresi Poisson dilakukan menggunakan MLE
• Uji Wald dan Likelihood Ratio digunakan untuk pengujian hipotesis
• AIC dan BIC digunakan untuk evaluasi dan pemilihan model terbaik
Regresi logistik merupakan analisis yang digunakan untuk melihat hubungan antara variabel respon yang bersifat kategorik (kualitatif) dan variabel-variabel prediktor yang bersifat nominal atau ordinal (kualitatif) maupun interval atau rasio (kuantitatif)
Regresi logistik biner merupakan suatu metode analisis data yang digunakan untuk mencari hubungan antara variabel respon (Y) yang bersifat biner atau dikotomus dengan variabel prediktor (X) yang bersifat polikotomus. Keluaran dari variabel respon (Y) terdiri dari 2(dua) kategori yang biasanya dinotasikan dengan Y= 1 (sukses) dan Y= 0 (gagal).bentuk umum regresi logistik adalah sebagai berikut.
\[ \pi(X) = \frac{\exp(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)}{1 + \exp(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)} \]
Regresi logistik digunakan untuk menganalisis hubungan antara satu variabel respon biner dengan satu atau lebih variabel prediktor. Prediktor dapat berupa:
Nominal: Tidak memiliki urutan
Ordinal: Memiliki urutan
Rasio: Skala numerik dengan nol mutlak
Sebuah lembaga pelatihan ingin mengetahui faktor-faktor yang memengaruhi kemungkinan kelulusan peserta ujian sertifikasi. Tiga variabel dipertimbangkan:
Jenis pelatihan (Online / Offline)
Frekuensi latihan mandiri (Rarely, Sometimes, Often, Always)
Nilai ujian praktik (0-100)
library(dplyr)
library(ggplot2)
library(broom)
## Warning: package 'broom' was built under R version 4.4.3
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rowsset.seed(123)
n <- 500
training_type <- sample(c("Online", "Offline"), n, replace = TRUE)
practice_freq <- sample(c("Rarely", "Sometimes", "Often", "Always"),
size = n, replace = TRUE,
prob = c(0.2, 0.3, 0.3, 0.2))
practice_freq <- factor(practice_freq, levels = c("Rarely", "Sometimes", "Often", "Always"), ordered = TRUE)
practical_score <- round(rnorm(n, mean = 75, sd = 12), 1)
practical_score <- pmin(pmax(practical_score, 0), 100)
logit_p <- -1.8 +
0.5 * (training_type == "Offline") +
0.7 * as.numeric(practice_freq) +
0.06 * practical_score
p <- 1 / (1 + exp(-logit_p))
passed <- rbinom(n, 1, p)
library(tibble)
## Warning: package 'tibble' was built under R version 4.4.3
sim_data <- tibble(passed, training_type, practice_freq, practical_score)
head(sim_data)
sim_data_nominal <- sim_data %>%
mutate(practice_freq = factor(practice_freq, levels = c("Rarely", "Sometimes", "Often", "Always")))
options(contrasts = c("contr.treatment", "contr.treatment"))
model_nominal <- glm(passed ~ training_type + practice_freq + practical_score,
data = sim_data_nominal, family = binomial)
summary(model_nominal)
##
## Call:
## glm(formula = passed ~ training_type + practice_freq + practical_score,
## family = binomial, data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.71055 2.23981 1.210 0.2262
## training_typeOnline -2.15725 1.06493 -2.026 0.0428 *
## practice_freqSometimes -0.23778 0.78829 -0.302 0.7629
## practice_freqOften 0.66534 0.92967 0.716 0.4742
## practice_freqAlways 0.73760 1.17327 0.629 0.5296
## practical_score 0.03549 0.02801 1.267 0.2052
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 98.039 on 499 degrees of freedom
## Residual deviance: 88.110 on 494 degrees of freedom
## AIC: 100.11
##
## Number of Fisher Scoring iterations: 8
Keterangan : baseline dari model ini adalah training type offline dan practice rarely
Intercept (2.71055):
- Training Type: "Offline" (baseline)
- Practice Frequency: "Rarely" (baseline)
- Practical Score: 0
training_typeOnline (-2.15725):
Peserta dengan pelatihan online memiliki log-odds kelulusan lebih rendah sebesar 2.15725 dibandingkan peserta pelatihan offline.
Efek ini signifikan secara statistik (p = 0.0428), yang menunjukkan bahwa jenis pelatihan memiliki pengaruh terhadap peluang kelulusan.
practice_freqSometimes (-0.23778):
practice_freqOften (0.66534):
practice_freqAlways (0.73760):
practical_score (0.03549):
sim_data_numeric <- sim_data %>%
mutate(practice_numeric = case_when(
practice_freq == "Rarely" ~ 1,
practice_freq == "Sometimes" ~ 2,
practice_freq == "Often" ~ 3,
practice_freq == "Always" ~ 4
))
model_numeric <- glm(passed ~ training_type + practice_numeric + practical_score,
family = binomial, data = sim_data_numeric)
summary(model_numeric)
##
## Call:
## glm(formula = passed ~ training_type + practice_numeric + practical_score,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.29027 2.31649 0.989 0.3228
## training_typeOnline -2.10258 1.06180 -1.980 0.0477 *
## practice_numeric 0.30335 0.32169 0.943 0.3457
## practical_score 0.03378 0.02794 1.209 0.2267
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 98.039 on 499 degrees of freedom
## Residual deviance: 88.766 on 496 degrees of freedom
## AIC: 96.766
##
## Number of Fisher Scoring iterations: 8
Keterangan : model ini membuat dari ordinal menjadi bentuk angka 1-4 untuk masing-masing tingkatan
Intercept (2.29027):
- Peserta dengan training_type = Offline,
- practice_numeric = 0 (asumsi setara dengan kategori "Rarely"),
- practical_score = 0.
training_typeOnline (-2.10258):
Peserta pelatihan online memiliki log-odds kelulusan lebih rendah 2.10258 poin dibandingkan dengan pelatihan offline.
Efek ini signifikan secara statistik (p = 0.0477).
practice_numeric (0.30335):
Setiap kenaikan 1 tingkat dalam frekuensi latihan (misal dari “Rarely” ke “Sometimes”, atau dari “Sometimes” ke “Often”) meningkatkan log-odds kelulusan sebesar 0.30335.
Namun, efek ini tidak signifikan (p = 0.3457). Sehingga setiap kenaikan 1 tingkat frekuensi latihan tidak membuat kenaikan yang signifikan untuk peluang lulus
practical_score (0.03378):
Setiap kenaikan 1 poin skor praktik meningkatkan log-odds kelulusan sebesar 0.03378.
Tapi efek ini juga tidak signifikan (p = 0.2267).
list(AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric))
## $AIC_Nominal
## [1] 100.1095
##
## $AIC_Numeric
## [1] 96.76567
nullmod <- glm(passed ~ 1, data = sim_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.1012817 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.09458919 (df=4)
Keterangan :
Dari hasil pengujian dengan Goodness of Fit, didapatkan bahwa nilai AIC lebih kecil pada model numeric sehingga model ini lebih baik, sedangkan dengan McFadden didapatkan bahwa yang lebih baik adalah model yang ordinal. Namun akan diambil yang model numeric karena model ini memiliki model yang lebih efisien dan nilai pada McFadden tidak berbeda jauh antara model ordinal dan model numeric (sekitar 1%)
sim_data_nominal <- sim_data_nominal %>%
mutate(predicted_nominal = predict(model_nominal, type = "response"))
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted_numeric = predict(model_numeric, type = "response"))
sim_data_nominal %>%
ggplot(aes(x = practical_score, y = predicted_nominal, color = practice_freq)) +
geom_point(alpha = 0.6) +
labs(title = "Probabilitas Lulus (Latihan Sebagai Nominal)",
x = "Nilai Ujian Praktik",
y = "Probabilitas Prediksi") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
sim_data_numeric %>%
mutate(practice_numeric = factor(practice_numeric)) %>%
ggplot(aes(x = practical_score, y = predicted_numeric, color = practice_numeric)) +
geom_point(alpha = 0.6) +
labs(title = "Probabilitas Lulus (Latihan Sebagai Numeric)",
x = "Nilai Ujian Praktik",
y = "Probabilitas Prediksi") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
Koefisien model ordinal :
tidy(model_nominal) %>%
kable(format = "latex", booktabs = TRUE,
caption = "Ringkasan Koefisien (Latihan Sebagai Dummy)") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Koefisien model numeric :
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE,
caption = "Ringkasan Koefisien (Latihan Sebagai Numeric)") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Training : training type offline memiliki peluang yang lebih tinggi dibandingkan dengan online
Frekuensi latihan mandiri :
jika dianggap dummy : tiap frekuensi latihan dibandingkan dengan Rarely
jika dianggap numeric : tiap kenaikan satu frekuensi latihan meningkatkan peluang lulus
Nilai ujian praktik : nilai ujian lebih tinggi, maka peluang lulus semakin tinggi
Catatan : data merupakan data dummy, hasil dari data asli akan berbeda dengan data ini
Dalam analisis regresi logistik, pemilihan model sangat krusial untuk mendapatkan model yang baik dalam memprediksi probabilitas kejadian suatu peristiwa (respon biner). Dua pendekatan utama dalam membangun model adalah pendekatan Confirmatory dan Exploratory
1. Confirmatory (Pendekatan Konfirmator)
Pendekatan ini bersifat deduktif. Artinya, peneliti memulai dari teori atau hipotesis yang sudah ada, dan bertujuan untuk menguji apakah hubungan yang diasumsikan benar-benar terjadi dalam data.
Ciri-ciri utama - Berbasis teori → Peneliti tidak asal mencoba-coba kombinasi variabel, tetapi sudah punya model yang dihipotesiskan.
Model penuh (full model) langsung dibangun → Semua variabel yang dianggap penting langsung dimasukkan.
Uji hipotesis → Fokus bukan mencari “model paling fit”, tapi apakah variabel X benar-benar berpengaruh?.
Perbandingan model → Pengujian dilakukan dengan metode statistik seperti Likelihood Ratio Test (LRT) untuk melihat apakah penambahan atau pengurangan suatu variabel secara signifikan meningkatkan model.
Contoh penggunaan - Ada teori bahwa faktor X1 (misalnya usia) dan X2 (misalnya pendapatan) mempengaruhi kemungkinan membeli produk.
Maka, peneliti langsung membangun model dengan X1 dan X2, tidak mencoba-coba variabel lain.
Tujuannya untuk membuktikan bahwa X2 signifikan atau tidak terhadap probabilitas membeli.
Ciri-ciri utama - Tidak berbasis teori yang kaku → Peneliti mencari tahu variabel mana yang paling relevan.
Pemilihan model bertahap → Dibangun secara bertahap dengan berdasarkan kriteria statistik, seperti:
AIC (Akaike Information Criterion) → untuk membandingkan model.
Deviance, log-likelihood → untuk mengukur goodness-of-fit.
Strategi pemilihan variabel:
Forward Selection → mulai dari model kosong, variabel ditambahkan satu per satu jika signifikan.
Backward Elimination → mulai dari model penuh, variabel yang tidak signifikan dikeluarkan.
Stepwise Selection → kombinasi keduanya → variabel bisa masuk dan keluar secara dinamis.
Contoh penggunaan - Peneliti tidak tahu pasti apakah faktor usia, pendapatan, jenis kelamin, atau preferensi lain mempengaruhi pembelian produk.
Tujuan:
Tujuan analisis adalah menemukan model yang parsimonious, yaitu cukup sederhana namun mampu memberikan performa prediksi yang baik dalam mengidentifikasi kemungkinan pasien akan datang kembali untuk kontrol. Pemilihan antara pendekatan Confirmatory dan Exploratory bergantung pada tujuan penelitian. Jika rumah sakit ingin menguji hipotesis tertentu, misalnya bahwa riwayat penyakit kronis secara signifikan mempengaruhi kepatuhan kontrol pasien, maka pendekatan Confirmatory digunakan. Sebaliknya, jika rumah sakit ingin menemukan kombinasi variabel terbaik yang mampu memprediksi perilaku kontrol pasien berdasarkan data historis, maka pendekatan Exploratory lebih sesuai. Dalam praktiknya, kedua pendekatan ini sering digunakan secara komplementer: teori medis atau literatur kesehatan digunakan sebagai dasar, kemudian seleksi eksploratori dilakukan untuk menyempurnakan model prediksi. Simulasi Data
Sebuah rumah sakit ingin memprediksi kemungkinan pasien akan datang kembali untuk kontrol (y) berdasarkan data pasien, yaitu usia pasien (x1), riwayat penyakit kronis (x2), dan jarak rumah pasien ke rumah sakit (x3). Dengan memanfaatkan data historis dan model klasifikasi biner, rumah sakit berharap dapat mengidentifikasi pasien yang berisiko tinggi untuk tidak kembali sejak awal, sehingga dapat meningkatkan efektivitas pemantauan pasien, mengurangi risiko komplikasi, dan merencanakan program tindak lanjut yang lebih tepat sasaran.
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
## Warning: package 'MASS' was built under R version 4.4.3
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: lattice
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
##
## Attaching package: 'DescTools'
## The following objects are masked from 'package:caret':
##
## MAE, RMSE
set.seed(123)
# Jumlah data
n <- 300
# Variabel
usia <- sample(18:80, n, replace = TRUE)
riwayat_penyakit_kronis <- rbinom(n, 1, 0.4)
jarak_rumah_rumah_sakit_km <- runif(n, 1, 50)
# Linear predictor (model simulasi)
lin_pred <- -1 + 0.03 * usia + 1.2 * riwayat_penyakit_kronis - 0.05 * jarak_rumah_rumah_sakit_km
# Probabilitas
p <- 1 / (1 + exp(-lin_pred))
# Target
datang_kontrol <- rbinom(n, 1, p)
# Buat data frame
df <- data.frame(
datang_kontrol = as.factor(datang_kontrol),
usia,
riwayat_penyakit_kronis,
jarak_rumah_rumah_sakit_km
)
# Lihat data
head(df)
Pemilihan Model
Model Full
model_full <- glm(datang_kontrol ~ usia + riwayat_penyakit_kronis + jarak_rumah_rumah_sakit_km,
data = df, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = datang_kontrol ~ usia + riwayat_penyakit_kronis +
## jarak_rumah_rumah_sakit_km, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.105345 0.467538 -2.364 0.0181 *
## usia 0.034478 0.008284 4.162 3.15e-05 ***
## riwayat_penyakit_kronis 1.680416 0.294797 5.700 1.20e-08 ***
## jarak_rumah_rumah_sakit_km -0.061309 0.010773 -5.691 1.26e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 412.47 on 299 degrees of freedom
## Residual deviance: 321.03 on 296 degrees of freedom
## AIC: 329.03
##
## Number of Fisher Scoring iterations: 4
null_model <- glm(datang_kontrol ~ 1, data = df, family = binomial)
model_full <- glm(datang_kontrol ~ usia + riwayat_penyakit_kronis + jarak_rumah_rumah_sakit_km,
data = df, family = binomial)
step_forward <- step(null_model, direction = "forward",
scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both",
scope = formula(model_full), trace = FALSE)
AIC(model_full, step_forward, step_backward, step_both)
pred_prob <- predict(step_both, type = "response")
# Penting: target = df$datang_kontrol
roc_obj <- roc(df$datang_kontrol, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Plot ROC
plot(roc_obj, main = "Kurva ROC - Prediksi Pasien Datang Kontrol", col = "yellow")
# AUC
auc(roc_obj)
## Area under the curve: 0.8022
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.2627278 0.3516476 0.2216883
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), df$datang_kontrol, positive = "1")
# Tampilkan Confusion Matrix
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 125 47
## 1 41 87
##
## Accuracy : 0.7067
## 95% CI : (0.6516, 0.7576)
## No Information Rate : 0.5533
## P-Value [Acc > NIR] : 3.618e-08
##
## Kappa : 0.404
##
## Mcnemar's Test P-Value : 0.594
##
## Sensitivity : 0.6493
## Specificity : 0.7530
## Pos Pred Value : 0.6797
## Neg Pred Value : 0.7267
## Prevalence : 0.4467
## Detection Rate : 0.2900
## Detection Prevalence : 0.4267
## Balanced Accuracy : 0.7011
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.6492537 0.7530120
library(MASS)
library(broom)
library(DescTools)
library(caret)
Simulasi Data Sebuah perguruan tinggi ingin memprediksi kemungkinan mahasiswa akan lulus tepat waktu (y) berdasarkan data karakteristik mahasiswa, yaitu Indeks Prestasi Kumulatif (IPK) saat ini (x1), status bekerja sambil kuliah (x2), dan tingkat keaktifan dalam organisasi kemahasiswaan (x3). Dengan memanfaatkan data historis mahasiswa dan model klasifikasi biner, perguruan tinggi berharap dapat mengidentifikasi mahasiswa yang berisiko tidak lulus tepat waktu sejak dini, sehingga dapat merancang intervensi yang tepat guna meningkatkan tingkat kelulusan dan efektivitas proses pembelajaran.
set.seed(123)
# Jumlah data
n <- 150
# IPK (skala 0-4)
IPK <- pmin(pmax(rnorm(n, mean = 3.0, sd = 0.5), 0), 4)
# Status kerja sambil kuliah (0 = tidak, 1 = iya)
kerja_sambil_kuliah <- rbinom(n, 1, 0.3)
# Keaktifan organisasi (0 = tidak, 1 = aktif)
aktif_organisasi <- rbinom(n, 1, 0.5)
# Linear predictor (model logit)
lin_pred <- -1.2 + 1.6 * IPK - 0.4 * kerja_sambil_kuliah + 0.5 * aktif_organisasi
# Probabilitas
p <- 1 / (1 + exp(-lin_pred))
# Target: lulus tepat waktu (1) / tidak (0)
lulus_tepat_waktu <- rbinom(n, 1, p)
# Data frame
data <- data.frame(
lulus_tepat_waktu = as.factor(lulus_tepat_waktu),
IPK,
kerja_sambil_kuliah,
aktif_organisasi
)
# Lihat data
head(data)
Pembuatan Model
# Model 1 → hanya IPK
model1 <- glm(lulus_tepat_waktu ~ IPK, data = data, family = binomial)
# Model 2 → IPK + kerja sambil kuliah
model2 <- glm(lulus_tepat_waktu ~ IPK + kerja_sambil_kuliah, data = data, family = binomial)
# Model 3 → IPK + kerja sambil kuliah + aktif organisasi (model full)
model3 <- glm(lulus_tepat_waktu ~ IPK + kerja_sambil_kuliah + aktif_organisasi, data = data, family = binomial)
Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
anova(model1, model2, test = "LRT")
anova(model2, model3, test = "LRT")
Hasil perbandingan AIC menunjukkan bahwa penambahan variabel aktif_organisasi dari model2 ke model3 hanya memberikan penurunan AIC yang sangat kecil (178 menjadi 177). Berdasarkan prinsip parsimony, model yang lebih sederhana dipilih, yaitu model dengan prediktor IPK dan kerja_sambil_kuliah, karena performa prediksi yang dihasilkan sudah cukup baik dan model lebih mudah diinterpretasikan. Selain itu, pemilihan model yang sederhana juga membantu mencegah terjadinya overfitting.
Rumus dan Penjelasan
Rumus AIC
\[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan: AIC (Akaike Information Criterion) adalah ukuran untuk mengevaluasi model statistik dengan mempertimbangkan goodness-of-fit (melalui log-likelihood) dan kompleksitas model (melalui jumlah parameter \(k\)). AIC memberi penalti pada model yang terlalu kompleks, sehingga membantu memilih model yang seimbang antara akurasi dan kesederhanaan. Semakin kecil nilai AIC, semakin baik model tersebut secara keseluruhan.
Rumus Deviance
\[ D = -2 \left[\log L(\text{model}) - \log L(\text{model saturasi})\right] \]
Penjelasan: Deviance mengukur seberapa jauh model saat ini dibandingkan dengan model sempurna (model saturasi). Nilai deviance yang kecil menu
Rumus Likelihood-Ratio
\[ G^2 = -2 (\log L_0 - \log L_1) \]
Penjelasan: Statistik Likelihood Ratio merupakan alat uji yang digunakan untuk menentukan apakah penambahan variabel baru ke dalam sebuah model secara signifikan meningkatkan kecocokan (fit) model terhadap data. Uji ini membandingkan dua model: model sederhana (dengan lebih sedikit variabel) dan model yang lebih kompleks (dengan variabel tambahan). Hasil uji ditunjukkan oleh statistik \(G^2\), di mana nilai \(G^2\) yang besar mengindikasikan adanya perbedaan yang berarti antara kedua model. Jika nilai p-value yang diperoleh juga kecil (biasanya di bawah ambang batas seperti 0.05), maka dapat disimpulkan bahwa model yang lebih kompleks memberikan peningkatan kecocokan yang signifikan secara statistik dibandingkan model yang lebih sederhana.
# Prediksi probabilitas (dari model3)
pred_prob <- predict(model3, type = "response")
# Prediksi kelas (threshold 0.5)
pred_class <- factor(ifelse(pred_prob >= 0.5, 1, 0))
# Confusion Matrix
conf_matrix <- confusionMatrix(pred_class, data$lulus_tepat_waktu, positive = "1")
## Warning in confusionMatrix.default(pred_class, data$lulus_tepat_waktu, positive
## = "1"): Levels are not in the same order for reference and data. Refactoring
## data to match.
# Tampilkan Confusion Matrix
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 0 0
## 1 4 146
##
## Accuracy : 0.9733
## 95% CI : (0.9331, 0.9927)
## No Information Rate : 0.9733
## P-Value [Acc > NIR] : 0.6288
##
## Kappa : 0
##
## Mcnemar's Test P-Value : 0.1336
##
## Sensitivity : 1.0000
## Specificity : 0.0000
## Pos Pred Value : 0.9733
## Neg Pred Value : NaN
## Prevalence : 0.9733
## Detection Rate : 0.9733
## Detection Prevalence : 1.0000
## Balanced Accuracy : 0.5000
##
## 'Positive' Class : 1
##
Sensitivitas: Kemampuan model mendeteksi kelas positif secara benar (True Positive Rate)
\[ \text{Sensitivity} = \frac{\text{TP}}{\text{TP} + \text{FN}} \]
Spesifisitas: Kemampuan model mendeteksi kelas negatif secara benar (True Negative Rate)
\[ \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} \]
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 1 0
kesimpulan
-Semakin kecil deviance, semakin baik model dalam “menjelaskan” data.
Artinya, prediksi model lebih dekat ke data observasi → model lebih cocok (good fit).
-Seberapa baik model cocok dengan data (fit)
-Seberapa kompleks modelnya (jumlah parameter)
-Semakin rendah AIC, model lebih disukai:
-Cukup akurat tanpa terlalu kompleks.
-Jadi, AIC membantu memilih model yang efisien → cukup baik tanpa overfitting.
-Model sederhana (misal, dengan lebih sedikit variabel)
-Model kompleks (dengan lebih banyak variabel/parameter)
-Jika LRT signifikan → model kompleks memang lebih baik secara statistik.
-Jika tidak signifikan → model sederhana sudah cukup.
-Prediksi model (prediksi)
-Data aktual (kenyataan)
-Digunakan untuk menghitung metrik evaluasi:
-Akurasi, sensitivitas, spesifisitas, dll.
-Membantu melihat seberapa bagus model dalam memprediksi outcome yang benar.
Kenapa?
-Lebih sederhana → lebih mudah diinterpretasikan, lebih generalizable.
-Menghindari overfitting (terlalu menyesuaikan model ke data saat ini → jelek untuk data baru).
-Jadi: jangan tambah variabel kalau tidak perlu.
Kurva ROC adalah alat visual yang digunakan untuk mengevaluasi performa model klasifkasi biner. Kurva ini menunjukkan trade-of antara True Positive Rate (Sensitivity) dan False Positive Rate (1 - Specificity) pada berbagai threshold klasifkasi.
• Sumbu Y: Sensitivity = True Positive Rate = TP / (TP + FN)
• Sumbu X: 1 - Specifcity = False Positive Rate = FP / (FP + TN)
• Garis diagonal (dari kiri bawah ke kanan atas) menunjukkan performa acak (random guess).
• Kurva yang mendekati pojok kiri atas menunjukkan performa klasifkasi yang lebih baik.
Saat cut-off menurun, model mengklasifkasikan lebih banyak pengamatan sebagai positif:
• Sensitivitas naik
• Spesifisitas turun
Saat cut-off naik, model menjadi lebih konservatif:
• Sensitivitas turun
• Spesifisitas naik
Kurva ideal memiliki bentuk:
• Naik tajam secara vertikal hingga mencapai sensitivitas = 1
• Lalu bergerak secara horizontal menuju 1 - specifcity = 1
• Area under the curve (AUC) mendekati 1
• AUC = 0.5: model tidak lebih baik dari tebak acak
• AUC > 0.7: model cukup baik
• AUC > 0.9: model sangat baik
• AUC dikenal juga sebagai concordance index, yaitu probabilitas bahwa model memberikan nilai skor probabilitas yang lebih tinggi untuk kasus positif daripada kasus negatif.
• Untuk membandingkan performa beberapa model klasifkasi
• Untuk memilih threshold (cut-of) optimal berdasarkan kebutuhan aplikasi (misalnya: lebih penting menghindari false negative atau false positive)
library(pROC)
set.seed(123)
# Variabel predictor
x1 <- pmin(pmax(rnorm(150, mean = 3.0, sd = 0.5), 0), 4) # IPK
x2 <- rbinom(150, 1, 0.3) # kerja_sambil_kuliah
x3 <- rbinom(150, 1, 0.5) # aktif_organisasi
# Linear predictor
lin_pred <- -1.2 + 1.6 * x1 - 0.4 * x2 + 0.5 * x3
# Probabilitas
p <- 1 / (1 + exp(-lin_pred))
# Target variabel
y <- rbinom(150, 1, p)
# Data frame
data <- data.frame(y = as.factor(y), x1, x2, x3)
# Model regresi logistik
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
# Prediksi probabilitas
pred <- predict(model, type = "response")
# ROC object
roc_obj <- roc(data$y, pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Plot ROC
plot(roc_obj, main = "ROC Curve", col = "blue", lwd = 2)
legend("bottomright", legend = paste("AUC =", round(auc(roc_obj), 3)), col = "blue", lwd = 2)
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.7055
Untuk memilih threshold terbaik, kita bisa mengevaluasi sensitivitas dan spesifsitas pada berbagai cut-off.
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
true_y <- factor(data$y, levels = c(0, 1))
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- factor(ifelse(pred >= t, 1, 0), levels = c(0, 1))
cm <- table(Pred = pred_class, Obs = true_y)
TP <- ifelse("1" %in% rownames(cm) && "1" %in% colnames(cm), cm["1", "1"], 0)
FN <- ifelse("0" %in% rownames(cm) && "1" %in% colnames(cm), cm["0", "1"], 0)
if ((TP + FN) == 0) return(NA)
TP / (TP + FN)
})
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- factor(ifelse(pred >= t, 1, 0), levels = c(0, 1))
cm <- table(Pred = pred_class, Obs = true_y)
TN <- ifelse("0" %in% rownames(cm) && "0" %in% colnames(cm), cm["0", "0"], 0)
FP <- ifelse("1" %in% rownames(cm) && "0" %in% colnames(cm), cm["1", "0"], 0)
if ((TN + FP) == 0) return(NA)
TN / (TN + FP)
})
print(results)
## Threshold Sensitivity Specificity
## 1 0.10 1 0
## 2 0.15 1 0
## 3 0.20 1 0
## 4 0.25 1 0
## 5 0.30 1 0
## 6 0.35 1 0
## 7 0.40 1 0
## 8 0.45 1 0
## 9 0.50 1 0
## 10 0.55 1 0
## 11 0.60 1 0
## 12 0.65 1 0
## 13 0.70 1 0
## 14 0.75 1 0
## 15 0.80 1 0
## 16 0.85 1 0
## 17 0.90 1 0
Cut-off optimal bisa dipilih berdasarkan:
Maksimum dari Sensitivity + Specificity
Atau mempertimbangkan trade-of sesuai tujuan aplikasi (misalnya: jika False Negative harus dihindari, maka prioritaskan sensitivitas tinggi)
ROC cocok saat proporsi kelas seimbang
Untuk data dengan kelas tidak seimbang, precision-recall curve bisa lebih informatif
Penjelasan Precision-Recall Curve
Kurva Precision-Recall (PR) adalah alat evaluasi performa model klasifikasi, khususnya sangat berguna saat bekerja dengan data yang tidak seimbang (class imbalance).
1. Definisi
Precision (Presisi): Proporsi prediksi positif yang benar-benar positif
\[ \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} \]
Recall (Sensitivitas): Proporsi kasus positif yang berhasil diprediksi positif
\[ \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} \]
Interpretasi - PR Curve pada model prediksi kelulusan tepat waktu memperlihatkan bagaimana Precision berubah seiring peningkatan Recall.
Idealnya, kita ingin Precision dan Recall sama-sama tinggi, namun biasanya terdapat trade-off antara keduanya.
Model yang baik akan menghasilkan kurva yang melengkung ke pojok kanan atas, seperti yang terlihat pada hasil PR Curve dari data ini.
Pada data ini, AUPRC ≈ 0.98 → artinya model mampu membedakan dengan sangat baik antara mahasiswa yang lulus tepat waktu (kelas positif) dan yang tidak.
Baseline AUPRC = prevalensi kelas “lulus tepat waktu” dalam data (proporsi mahasiswa yang lulus tepat waktu).
| Aspek | ROC Curve | Precision-Recall Curve |
|---|---|---|
| Fokus | Semua kelas (positif dan negatif) | Kelas positif saja (lulus tepat waktu) |
| Kuat di | Data dengan distribusi kelas yang seimbang | Data dengan kelas tidak seimbang (misalnya: sedikit yang lulus tepat waktu) |
| Sumbu Y | Sensitivitas (Recall) | Precision |
| Sumbu X | 1 - Spesifisitas | Recall |
5. Visualisasi PR Curve di R
library(PRROC)
## Warning: package 'PRROC' was built under R version 4.4.3
## Loading required package: rlang
set.seed(123)
# Variabel predictor
x1 <- pmin(pmax(rnorm(150, mean = 3.0, sd = 0.5), 0), 4) # IPK
x2 <- rbinom(150, 1, 0.3) # kerja_sambil_kuliah
x3 <- rbinom(150, 1, 0.5) # aktif_organisasi
# Linear predictor
lin_pred <- -1.2 + 1.6 * x1 - 0.4 * x2 + 0.5 * x3
# Probabilitas
p <- 1 / (1 + exp(-lin_pred))
# Target variabel
y <- rbinom(150, 1, p)
# Data frame
data <- data.frame(y = y, x1, x2, x3)
# Model regresi logistik
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
# Prediksi probabilitas
prob <- predict(model, type = "response")
# PR curve
pr <- pr.curve(
scores.class0 = prob[data$y == 1],
scores.class1 = prob[data$y == 0],
curve = TRUE
)
# Plot PR curve
plot(pr)
6. Catatan
Precision tinggi di sepanjang rentang Recall Artinya: model jarang memberikan false positive Prediksi “positif” cukup dipercaya
AUC PR = 0.98+ → performa sangat baik model sangat baik dalam mendeteksi kasus positif, meskipun datanya imbalanced.
Simulasi Data
Misalkan kita ingin memprediksi apakah seorang mahasiswa akan lulus ujian akhir atau tidak, berdasarkan dua variabel prediktor:
motivasi: skor motivasi belajar (skala 0–10)belajar: rata-rata jam belajar per hariset.seed(123)
# Jumlah data
n <- 150
# Variabel predictor
IPK <- pmin(pmax(rnorm(n, mean = 3.0, sd = 0.5), 0), 4)
kerja_sambil_kuliah <- rbinom(n, 1, 0.3)
aktif_organisasi <- rbinom(n, 1, 0.5)
# Linear predictor
lin_pred <- -1.2 + 1.6 * IPK - 0.4 * kerja_sambil_kuliah + 0.5 * aktif_organisasi
# Probabilitas
p <- 1 / (1 + exp(-lin_pred))
# Target
lulus <- rbinom(n, 1, p)
# Data frame
data <- data.frame(
lulus = as.factor(lulus),
IPK,
kerja_sambil_kuliah,
aktif_organisasi
)
# Lihat data
head(data)
Model Logistik dan Null Model
# Model penuh
model <- glm(lulus ~ IPK + kerja_sambil_kuliah + aktif_organisasi, data = data, family = binomial)
# Model null (intercept only)
model_null <- glm(lulus ~ 1, data = data, family = binomial)
Rumus Likelihood:
\[ R^2_{\text{Cox and Snell}} = 1 - \left( \frac{L_0}{L_M} \right)^{2/n} \]
\[ R^2_{\text{McFadden}} = 1 - \frac{\log L_M}{\log L_0} \]
Dengan:
Perhitungan Manual R-squared
logL0 <- logLik(model_null)
logLM <- logLik(model)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model)
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_Cox_Snell = cox_snell,
R2_McFadden = mcfadden
)
r2
Perhitungan Otomatis dengan Package Tambahan
Menggunakan pscl
if (!require(pscl)) install.packages("pscl"); library(pscl)
## Loading required package: pscl
## Warning: package 'pscl' was built under R version 4.4.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -16.89347046 -18.44354990 3.10015888 0.08404453 0.02045561 0.09382855
Menggunakan DescTools
if (!require(DescTools)) install.packages("DescTools"); library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.08404453 -0.13283346 0.02045561 0.09382855 0.02024922
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.10259191 0.01355770 0.94979350 0.01376915 41.78694092
## BIC logLik logLik0 G2
## 53.82948210 -16.89347046 -18.44354990 3.10015888
Interpretasi
Berdasarkan hasil perhitungan Pseudo R², model menunjukkan bahwa McFadden R² sebesar 0.084 dan Nagelkerke R² sebesar 0.0938, yang berarti model mampu menjelaskan sekitar 8–9% variasi dalam probabilitas mahasiswa lulus tepat waktu. Nilai Cox & Snell R² sebesar 0.0205 dan Veall-Zimmermann R² sebesar 0.1026 mendukung kesimpulan bahwa model memiliki kekuatan prediktif yang rendah hingga sedang. McKelvey-Zavoina R² yang tinggi (0.95) perlu ditafsirkan dengan hati-hati karena cenderung optimis. Nilai Tjur R² (0.0138) dan Efron R² (0.0136) yang rendah menunjukkan bahwa kemampuan model dalam memisahkan kelas masih terbatas. Perbandingan logLik antara model penuh (-16.89) dan model null (-18.44), dengan deviance difference (G²) sebesar 3.10, serta AIC sebesar 41.79, menunjukkan bahwa meskipun model memberikan perbaikan dibandingkan model null, kekuatan prediktifnya masih relatif lemah dan mungkin perlu ditingkatkan dengan penambahan variabel atau perbaikan model.
Distribusi multinomial adalah perluasan dari distribusi binomial untuk lebih dari dua kategori.
Jika \(X_1, X_2, \ldots, X_k\) menyatakan banyaknya kejadian dalam masing-masing dari \(k\) kategori, maka:
\[ P(X_1 = x_1, \ldots, X_k = x_k) = \frac{n!}{x_1! x_2! \ldots x_k!} p_1^{x_1} p_2^{x_2} \ldots p_k^{x_k} \]
dengan \(\sum_{i=1}^k x_i = n\) dan \(\sum_{i=1}^k p_i = 1\).
Sebuah survei dilakukan terhadap 25 orang yang diminta memilih satu dari tiga jenis minuman favorit: Teh (T), Kopi (K), dan Jus (J).
Hasil survei:
Teh: 10 orang
Kopi: 9 orang
Jus: 6 orang
Probabilitas teoretik preferensi:
\(p_T = 0.4\)
\(p_K = 0.35\)
\(p_J = 0.25\)
Pertanyaannya: Berapa peluang bahwa dalam 25 orang akan ada 10 yang memilih Teh, 9 memilih Kopi, dan 6 memilih Jus?
Rumus Distribusi Multinomial
Distribusi peluang multinomial:
\[ P(X_1 = x_1, \ldots, X_k = x_k) = \frac{n!}{x_1! x_2! \ldots x_k!} p_1^{x_1} p_2^{x_2} \ldots p_k^{x_k} \]
Dengan:
Perhitungan Manual di R
n <- 25
x <- c(10, 9, 6)
p <- c(0.4, 0.35, 0.25)
# Hitung komponen-koefisien
faktorial_total <- factorial(n)
faktorial_x <- prod(factorial(x))
koefisien <- faktorial_total / faktorial_x
# Hitung peluang
peluang <- koefisien * prod(p^x)
peluang
## [1] 0.03300954
Probabilitas bahwa 10 orang memilih Teh, 9 orang memilih Kopi, dan 6 orang memilih Jus (dengan proporsi preferensi 0.4, 0.35, dan 0.25) adalah 0.03300954.Distribusi multinomial digunakan untuk menghitung peluang dalam percobaan dengan beberapa kategori hasil. Rumus dasarnya merupakan generalisasi dari distribusi binomial untuk lebih dari dua kategori.
Model ini digunakan untuk memodelkan hubungan antara satu variabel respon kategorik (>2 kategori) dan satu atau lebih variabel prediktor.
Misalkan \(Y\) memiliki \(K\) kategori, dan kita pilih referensi (baseline) kategori \(K\), maka model logit untuk kategori \(j\) adalah:
\[ \log \left( \frac{P(Y = j)}{P(Y = K)} \right) = \beta_{0} + \beta_{1j}x_{1} + \cdots + \beta_{pj}x_{p} \]
untuk \(j = 1, 2, \ldots, K - 1\).
Baseline-category logit model adalah model regresi logistik untuk variabel respon kategorik dengan lebih dari dua kategori (nominal). Model ini menggunakan satu kategori sebagai acuan (baseline) dan membandingkan kategori lainnya terhadap baseline tersebut dalam bentuk logit:
\[ \log \left( \frac{\pi_j}{\pi_c} \right), \quad j = 1, \ldots, c - 1 \]
dengan:
Maka, terdapat sebanyak \((c - 1)\) fungsi logit.
Catatan: Kategori baseline bisa ditentukan secara eksplisit, tetapi default di R adalah kategori terakhir.
Model Regresi
Jika terdapat satu prediktor \(x\), maka bentuk umum model logit-nya adalah:
\[ \log \left( \frac{\pi_j}{\pi_c} \right) = \alpha_j + \beta_j x, \quad j = 1, \ldots, c - 1 \]
Contoh Kasus: 3 Kategori Respon
Misalkan respon \(Y\) memiliki tiga kategori: \(Y \in \{1, 2, 3\}\), dan kita gunakan kategori ke-3 sebagai baseline. Maka:
\[ \log \left( \frac{\pi_1}{\pi_3} \right) = \alpha_1 + \beta_1 x \]
\[ \log \left( \frac{\pi_2}{\pi_3} \right) = \alpha_2 + \beta_2 x \]
Terdapat dua model logit, satu untuk perbandingan kategori 1 dengan 3, dan satu lagi untuk kategori 2 dengan 3.
Relasi Antar Kategori
Jika ingin menghitung logit antara kategori 1 dan 2:
\[ \log \left( \frac{\pi_1}{\pi_2} \right) = \log \left( \frac{\pi_1 / \pi_3}{\pi_2 / \pi_3} \right) = \log \left( \frac{\pi_1}{\pi_3} \right) - \log \left( \frac{\pi_2}{\pi_3} \right) \] \[ = (\alpha_1 + \beta_1 x) - (\alpha_2 + \beta_2 x) = (\alpha_1 - \alpha_2) + (\beta_1 - \beta_2)x \] Model Baseline-category Logit:
multinom() dari
package nnet, dan kategori baseline bisa ditentukan
dengan relevel().Estimasi dilakukan menggunakan metode maximum likelihood dengan algoritma iteratif seperti Newton-Raphson.
Log-likelihood:
\[ l(\beta) = \sum_{i=1}^n \sum_{j=1}^K y_{ij} \log (\pi_{ij}) \]
dengan \(\pi_{ij} = P(Y = j | x_i)\) dan \(y_{ij} = 1\) jika \(Y_i = j\), 0 jika tidak.
Sebuah perusahaan teknologi ingin memahami faktor-faktor yang memengaruhi preferensi metode belajar yang digunakan oleh karyawan:
Kelas Tatap Muka
Online Mandiri
Workshop Internal
Perusahaan melakukan survei terhadap 300 karyawan dan mengumpulkan data berikut:
• Metode Belajar: Metode yang dipilih (Kelas Tatap Muka, Online Mandiri, Workshop Internal) • Umur: Usia karyawan • Departemen: Divisi karyawan (Teknologi, HR, Marketing) • Jam Belajar per Minggu: Rata-rata waktu belajar per minggu (jam)
Tujuannya adalah untuk mengetahui bagaimana usia, departemen, dan jam belajar per minggu memengaruhi pilihan metode belajar.
set.seed(123)
n <- 300
Departemen <- sample(c("Teknologi", "HR", "Marketing"), n, replace = TRUE)
Umur <- round(rnorm(n, mean = 32, sd = 6))
JamBelajar <- round(pmax(rnorm(n, mean = 5, sd = 2), 0))
# Simulasikan Metode Belajar berdasarkan probabilitas berbeda per departemen
MetodeBelajar <- sapply(Departemen, function(dep) {
if (dep == "Teknologi") {
sample(c("TatapMuka", "OnlineMandiri", "Workshop"), size = 1, prob = c(0.2, 0.6, 0.2))
} else if (dep == "HR") {
sample(c("TatapMuka", "OnlineMandiri", "Workshop"), size = 1, prob = c(0.5, 0.3, 0.2))
} else { # Marketing
sample(c("TatapMuka", "OnlineMandiri", "Workshop"), size = 1, prob = c(0.3, 0.4, 0.3))
}
})
df <- data.frame(MetodeBelajar = factor(MetodeBelajar), Umur, Departemen = factor(Departemen), JamBelajar)
df$MetodeBelajar <- relevel(df$MetodeBelajar, ref = "TatapMuka") # baseline
head(df)
# Load library
library(nnet)
## Warning: package 'nnet' was built under R version 4.4.3
# Bangun model multinomial logistic regression
model_mnlogit <- multinom(MetodeBelajar ~ Umur + Departemen + JamBelajar, data = df)
## # weights: 18 (10 variable)
## initial value 329.583687
## iter 10 value 308.522075
## final value 308.136936
## converged
# Tampilkan ringkasan model
summary(model_mnlogit)
## Call:
## multinom(formula = MetodeBelajar ~ Umur + Departemen + JamBelajar,
## data = df)
##
## Coefficients:
## (Intercept) Umur DepartemenMarketing DepartemenTeknologi
## OnlineMandiri -0.2694492 0.001245132 0.2087794 1.2414789
## Workshop -1.3652914 0.019841576 0.4188394 0.3102084
## JamBelajar
## OnlineMandiri -0.00210397
## Workshop 0.02950026
##
## Std. Errors:
## (Intercept) Umur DepartemenMarketing DepartemenTeknologi
## OnlineMandiri 0.7796719 0.02211027 0.3433113 0.3305439
## Workshop 0.9152793 0.02567608 0.3690142 0.4009605
## JamBelajar
## OnlineMandiri 0.07160369
## Workshop 0.08205368
##
## Residual Deviance: 616.2739
## AIC: 636.2739
z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
pval <- 2 * (1 - pnorm(abs(z)))
round(pval, 4)
## (Intercept) Umur DepartemenMarketing DepartemenTeknologi
## OnlineMandiri 0.7296 0.9551 0.5431 0.0002
## Workshop 0.1358 0.4397 0.2564 0.4391
## JamBelajar
## OnlineMandiri 0.9766
## Workshop 0.7192
Interpretasi:
• Nilai p-value kecil (< 0.05) (jika tersedia dari summary(model_mnlogit)) akan menunjukkan bahwa variabel tersebut signifikan memengaruhi preferensi metode belajar.
• Koefisien positif → meningkatkan peluang karyawan memilih kategori tersebut dibandingkan baseline “TatapMuka”. • Koefisien negatif → menurunkan peluang memilih kategori tersebut.
# Prediksi kelas
df$Predicted <- predict(model, newdata = df)
## Warning: 'newdata' had 300 rows but variables found have 150 rows
# Buat tabel silang (confusion matrix)
table(Predicted = df$Predicted, Actual = df$MetodeBelajar)
## Actual
## Predicted TatapMuka OnlineMandiri Workshop
## 2.59507264651465 1 1 0
## 2.75993573412098 2 0 0
## 2.77175189585188 0 0 2
## 2.78452422514228 0 0 2
## 2.82057849347666 0 2 0
## 2.83591331675478 1 1 0
## 2.86929817716267 0 1 1
## 2.88350664955421 1 1 0
## 2.88518948859592 2 0 0
## 2.89132997199225 0 1 1
## 2.90312801341912 1 1 0
## 2.90401125444009 2 0 0
## 2.92745042250114 1 1 0
## 2.93289066451963 1 0 1
## 2.9592773488061 0 1 1
## 2.96138596436767 1 1 0
## 2.98364910756455 0 2 0
## 3.02393998692691 0 2 0
## 3.03850555797244 1 0 1
## 3.04919676177176 0 2 0
## 3.05203374103066 0 1 1
## 3.05553984141603 0 1 1
## 3.06970864825753 0 2 0
## 3.07261455183093 0 2 0
## 3.07379074341304 1 0 1
## 3.08718891798467 0 0 2
## 3.10154119428781 1 1 0
## 3.10791541645273 0 2 0
## 3.11112054274569 1 0 1
## 3.11803920828947 1 1 0
## 3.12399782811504 0 1 1
## 3.14528587041944 0 2 0
## 3.14553459742686 2 0 0
## 3.14743581526857 1 0 1
## 3.15767047670303 1 1 0
## 3.16086186726647 0 0 2
## 3.16364913327856 0 2 0
## 3.16530860879246 1 0 1
## 3.17234190557092 0 2 0
## 3.17607114401294 1 1 0
## 3.17780403023024 0 1 1
## 3.18494933832502 0 1 1
## 3.18515948397119 1 0 1
## 3.18641019617859 0 1 1
## 3.18791009125877 0 2 0
## 3.19147767166122 0 2 0
## 3.20347901913452 2 0 0
## 3.23472117190779 0 2 0
## 3.23479460134609 1 1 0
## 3.23832344366599 0 1 1
## 3.24407138413706 2 0 0
## 3.25020530797707 0 2 0
## 3.25896443051699 0 1 1
## 3.27261938361195 1 1 0
## 3.27581592829943 0 0 2
## 3.28084699842461 1 0 1
## 3.28190693659425 0 1 1
## 3.28718765926726 1 1 0
## 3.2940238911952 1 0 1
## 3.31730203476353 1 1 0
## 3.31905261090976 0 2 0
## 3.32239171567491 1 0 1
## 3.32340363652843 2 0 0
## 3.32514292151164 1 0 1
## 3.32993515770449 0 2 0
## 3.34435158970998 0 2 0
## 3.35261862421695 1 1 0
## 3.3544187955912 1 0 1
## 3.35775988302022 0 2 0
## 3.35824580408498 0 0 2
## 3.37153622085543 1 1 0
## 3.37610753570944 1 1 0
## 3.37770833255072 0 1 1
## 3.37786947212721 0 2 0
## 3.39417547423714 1 1 0
## 3.40614478356826 1 0 1
## 3.40771173997902 1 1 0
## 3.42819285331634 1 1 0
## 3.44574514268465 0 1 1
## 3.44595049066801 0 1 1
## 3.44955961394191 1 1 0
## 3.46623448980506 1 0 1
## 3.47086737534692 1 0 1
## 3.47353885709585 0 1 1
## 3.49014054589183 1 0 1
## 3.5086483302845 1 1 0
## 3.51133327863521 0 1 1
## 3.51226165705424 2 0 0
## 3.54190523593683 0 1 1
## 3.55273721325505 1 1 0
## 3.56181086237751 2 0 0
## 3.56409553998275 0 2 0
## 3.57160259794109 0 2 0
## 3.57590753320966 2 0 0
## 3.57656127940844 0 1 1
## 3.59335125803082 1 0 1
## 3.63894630897406 0 2 0
## 3.69015061090732 2 0 0
## 3.72891389974439 0 1 1
## 3.77772134450003 1 1 0
## 3.8181579612608 0 1 1
## 3.82950795477718 1 0 1
## 3.88458255208264 1 1 0
## 3.91038197950387 1 5 0
## 20.0526666760642 1 1 0
## 20.153233124659 1 1 0
## 20.1845650700653 1 0 1
## 20.2041520089072 0 2 0
## 20.2159035009183 1 0 1
## 20.3055988703755 0 1 1
## 20.3290152501527 1 1 0
## 20.3766779075001 1 1 0
## 20.3873172189854 2 0 0
## 20.3925763263032 1 0 1
## 20.3928837554256 1 0 1
## 20.440378264906 0 1 1
## 20.4487709649475 1 1 0
## 20.4652659655127 1 0 1
## 20.4678138751684 0 1 1
## 20.4869962546874 1 0 1
## 20.4914695646205 0 2 0
## 20.4991333412623 1 0 1
## 20.5048845497284 2 0 0
## 20.5186318352213 0 2 0
## 20.5272484833848 1 1 0
## 20.5294405248991 0 2 0
## 20.5372302743764 0 1 1
## 20.5685272516554 1 0 1
## 20.593387373276 0 1 1
## 20.6209881137708 2 0 0
## 20.6485423676181 0 2 0
## 20.6672198763999 0 1 1
## 20.6936306232674 0 1 1
## 20.7088152574284 1 1 0
## 20.7613022654169 1 1 0
## 20.772020353721 1 1 0
## 20.782355353472 0 2 0
## 20.7926978715702 2 0 0
## 20.8372516789985 0 1 1
## 20.8487033401904 0 2 0
## 20.8814492843515 1 1 0
## 20.8905511103094 1 0 1
## 20.9376606067995 1 1 0
## 20.9496490723198 1 1 0
## 20.9553342144129 1 1 0
## 21.0094714113304 1 0 1
## 21.0144211839258 1 1 0
## 21.1228091833627 1 1 0
Model regresi logistik multinomial berhasil digunakan untuk:
• Menganalisis hubungan antara atribut karyawan (umur, departemen, dan jam belajar per minggu) dan preferensi metode belajar.
• Mengetahui faktor signifikan yang memengaruhi pilihan metode belajar, seperti pengaruh umur, departemen, atau jam belajar terhadap kecenderungan memilih Kelas Tatap Muka, Online Mandiri, atau Workshop Internal.
• Memungkinkan prediksi metode belajar yang kemungkinan akan dipilih oleh karyawan baru, berdasarkan karakteristik mereka (umur, departemen, dan jam belajar per minggu).
Regresi logistik ordinal digunakan ketika variabel respon \(Y\) bersifat ordinal (memiliki tingkatan atau urutan yang jelas antar kategori). Contohnya: tingkat kepuasan → Rendah, Sedang, Tinggi.
Model ini berbeda dengan:
egresi logistik biner: Digunakan saat \(Y\) hanya memiliki 2 kategori → contoh: Ya / Tidak, Sukses / Gagal.
Regresi logistik multinomial: Digunakan saat \(Y\) memiliki lebih dari 2 kategori tanpa urutan → contoh: Merah, Hijau, Biru.
Regresi logistik ordinal: Digunakan saat \(Y\) memiliki lebih dari 2 kategori dengan urutan/tingkatan → contoh: Rendah, Sedang, Tinggi.
Model yang digunakan adalah Cumulative Logit Model dengan asumsi proportional odds:
\[ \log \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta x \]
Untuk \(c\) kategori, terdapat \((c - 1)\) model logit kumulatif.
Koefisien \(\beta\) menjelaskan efek \(x\) terhadap kemungkinan berada pada kategori yang lebih rendah atau sama.
Odds ratio ditulis:
\[ \text{OR} = e^\beta \]
tingkat kepuasan pelanggan di sebuah restoran cepat saji, diukur berdasarkan kecepatan layanan (dalam skala 1–10, di mana 10 = sangat cepat).
Variabel respon ordinal:
1: Tidak Puas
2: Puas
3: Sangat Puas
Kita ingin melihat apakah kecepatan layanan berpengaruh terhadap tingkat kepuasan.
# Set seed untuk reproduksibilitas
set.seed(123)
# Jumlah observasi
n <- 175
# Variabel prediktor: Kecepatan Layanan (skala 1–10)
kecepatan <- round(runif(n, 1, 10))
# Variabel respon ordinal: Tingkat Kepuasan Pelanggan
kepuasan <- cut(4 + 0.5 * kecepatan + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Puas", "Sangat Puas"),
ordered_result = TRUE)
# Buat data frame
df <- data.frame(kepuasan, kecepatan)
# Lihat data awal
head(df)
# Load package yang diperlukan
library(MASS)
# Fit model regresi logistik ordinal
model_ord <- polr(kepuasan ~ kecepatan, data = df, Hess = TRUE)
# Lihat ringkasan model
summary(model_ord)
## Call:
## polr(formula = kepuasan ~ kecepatan, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## kecepatan 1.062 0.1187 8.94
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Puas 3.5343 0.5055 6.9921
## Puas|Sangat Puas 7.2007 0.8082 8.9094
##
## Residual Deviance: 220.4452
## AIC: 226.4452
(ctable <- coef(summary(model_ord)))
## Value Std. Error t value
## kecepatan 1.061508 0.1187355 8.940111
## Tidak Puas|Puas 3.534253 0.5054614 6.992131
## Puas|Sangat Puas 7.200681 0.8082091 8.909428
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## kecepatan 1.061508 0.1187355 8.940111 0
## Tidak Puas|Puas 3.534253 0.5054614 6.992131 0
## Puas|Sangat Puas 7.200681 0.8082091 8.909428 0
newdata <- data.frame(kinerja = 5:9)
predict(model_ord, newdata = newdata, type = "probs")
## Warning: 'newdata' had 5 rows but variables found have 175 rows
## Tidak Puas Puas Sangat Puas
## 1 0.3292054158 0.62127724 0.049517341
## 2 0.0069792170 0.20863895 0.784381833
## 3 0.1451337253 0.72397924 0.130887030
## 4 0.0024254173 0.08441050 0.913164086
## 5 0.0024254173 0.08441050 0.913164086
## 6 0.9222088705 0.07563906 0.002152066
## 7 0.0554724713 0.64122702 0.303300510
## 8 0.0024254173 0.08441050 0.913164086
## 9 0.0554724713 0.64122702 0.303300510
## 10 0.1451337253 0.72397924 0.130887030
## 11 0.0008403665 0.03100797 0.968151668
## 12 0.1451337253 0.72397924 0.130887030
## 13 0.0199122614 0.42286989 0.557217849
## 14 0.0554724713 0.64122702 0.303300510
## 15 0.8039608004 0.18984337 0.006195829
## 16 0.0024254173 0.08441050 0.913164086
## 17 0.5865514773 0.39574545 0.017703072
## 18 0.9222088705 0.07563906 0.002152066
## 19 0.3292054158 0.62127724 0.049517341
## 20 0.0008403665 0.03100797 0.968151668
## 21 0.0024254173 0.08441050 0.913164086
## 22 0.0199122614 0.42286989 0.557217849
## 23 0.0199122614 0.42286989 0.557217849
## 24 0.0008403665 0.03100797 0.968151668
## 25 0.0199122614 0.42286989 0.557217849
## 26 0.0199122614 0.42286989 0.557217849
## 27 0.0554724713 0.64122702 0.303300510
## 28 0.0554724713 0.64122702 0.303300510
## 29 0.3292054158 0.62127724 0.049517341
## 30 0.8039608004 0.18984337 0.006195829
## 31 0.0008403665 0.03100797 0.968151668
## 32 0.0024254173 0.08441050 0.913164086
## 33 0.0199122614 0.42286989 0.557217849
## 34 0.0069792170 0.20863895 0.784381833
## 35 0.9222088705 0.07563906 0.002152066
## 36 0.1451337253 0.72397924 0.130887030
## 37 0.0069792170 0.20863895 0.784381833
## 38 0.5865514773 0.39574545 0.017703072
## 39 0.3292054158 0.62127724 0.049517341
## 40 0.5865514773 0.39574545 0.017703072
## 41 0.8039608004 0.18984337 0.006195829
## 42 0.1451337253 0.72397924 0.130887030
## 43 0.1451337253 0.72397924 0.130887030
## 44 0.3292054158 0.62127724 0.049517341
## 45 0.8039608004 0.18984337 0.006195829
## 46 0.8039608004 0.18984337 0.006195829
## 47 0.5865514773 0.39574545 0.017703072
## 48 0.1451337253 0.72397924 0.130887030
## 49 0.5865514773 0.39574545 0.017703072
## 50 0.0024254173 0.08441050 0.913164086
## 51 0.9222088705 0.07563906 0.002152066
## 52 0.1451337253 0.72397924 0.130887030
## 53 0.0069792170 0.20863895 0.784381833
## 54 0.8039608004 0.18984337 0.006195829
## 55 0.0554724713 0.64122702 0.303300510
## 56 0.5865514773 0.39574545 0.017703072
## 57 0.8039608004 0.18984337 0.006195829
## 58 0.0069792170 0.20863895 0.784381833
## 59 0.0024254173 0.08441050 0.913164086
## 60 0.3292054158 0.62127724 0.049517341
## 61 0.0199122614 0.42286989 0.557217849
## 62 0.8039608004 0.18984337 0.006195829
## 63 0.3292054158 0.62127724 0.049517341
## 64 0.5865514773 0.39574545 0.017703072
## 65 0.0069792170 0.20863895 0.784381833
## 66 0.1451337253 0.72397924 0.130887030
## 67 0.0069792170 0.20863895 0.784381833
## 68 0.0069792170 0.20863895 0.784381833
## 69 0.0069792170 0.20863895 0.784381833
## 70 0.1451337253 0.72397924 0.130887030
## 71 0.0069792170 0.20863895 0.784381833
## 72 0.0199122614 0.42286989 0.557217849
## 73 0.0199122614 0.42286989 0.557217849
## 74 0.9222088705 0.07563906 0.002152066
## 75 0.1451337253 0.72397924 0.130887030
## 76 0.5865514773 0.39574545 0.017703072
## 77 0.3292054158 0.62127724 0.049517341
## 78 0.0199122614 0.42286989 0.557217849
## 79 0.3292054158 0.62127724 0.049517341
## 80 0.8039608004 0.18984337 0.006195829
## 81 0.5865514773 0.39574545 0.017703072
## 82 0.0199122614 0.42286989 0.557217849
## 83 0.1451337253 0.72397924 0.130887030
## 84 0.0069792170 0.20863895 0.784381833
## 85 0.8039608004 0.18984337 0.006195829
## 86 0.1451337253 0.72397924 0.130887030
## 87 0.0008403665 0.03100797 0.968151668
## 88 0.0024254173 0.08441050 0.913164086
## 89 0.0024254173 0.08441050 0.913164086
## 90 0.5865514773 0.39574545 0.017703072
## 91 0.8039608004 0.18984337 0.006195829
## 92 0.0199122614 0.42286989 0.557217849
## 93 0.3292054158 0.62127724 0.049517341
## 94 0.0199122614 0.42286989 0.557217849
## 95 0.3292054158 0.62127724 0.049517341
## 96 0.5865514773 0.39574545 0.017703072
## 97 0.0069792170 0.20863895 0.784381833
## 98 0.8039608004 0.18984337 0.006195829
## 99 0.1451337253 0.72397924 0.130887030
## 100 0.0554724713 0.64122702 0.303300510
## 101 0.0554724713 0.64122702 0.303300510
## 102 0.3292054158 0.62127724 0.049517341
## 103 0.1451337253 0.72397924 0.130887030
## 104 0.0008403665 0.03100797 0.968151668
## 105 0.1451337253 0.72397924 0.130887030
## 106 0.0024254173 0.08441050 0.913164086
## 107 0.0024254173 0.08441050 0.913164086
## 108 0.0554724713 0.64122702 0.303300510
## 109 0.1451337253 0.72397924 0.130887030
## 110 0.8039608004 0.18984337 0.006195829
## 111 0.0024254173 0.08441050 0.913164086
## 112 0.3292054158 0.62127724 0.049517341
## 113 0.8039608004 0.18984337 0.006195829
## 114 0.0008403665 0.03100797 0.968151668
## 115 0.0199122614 0.42286989 0.557217849
## 116 0.8039608004 0.18984337 0.006195829
## 117 0.0554724713 0.64122702 0.303300510
## 118 0.0008403665 0.03100797 0.968151668
## 119 0.0554724713 0.64122702 0.303300510
## 120 0.1451337253 0.72397924 0.130887030
## 121 0.0199122614 0.42286989 0.557217849
## 122 0.3292054158 0.62127724 0.049517341
## 123 0.3292054158 0.62127724 0.049517341
## 124 0.5865514773 0.39574545 0.017703072
## 125 0.3292054158 0.62127724 0.049517341
## 126 0.0008403665 0.03100797 0.968151668
## 127 0.8039608004 0.18984337 0.006195829
## 128 0.8039608004 0.18984337 0.006195829
## 129 0.8039608004 0.18984337 0.006195829
## 130 0.0199122614 0.42286989 0.557217849
## 131 0.0199122614 0.42286989 0.557217849
## 132 0.0024254173 0.08441050 0.913164086
## 133 0.0199122614 0.42286989 0.557217849
## 134 0.0069792170 0.20863895 0.784381833
## 135 0.0554724713 0.64122702 0.303300510
## 136 0.0199122614 0.42286989 0.557217849
## 137 0.0069792170 0.20863895 0.784381833
## 138 0.0069792170 0.20863895 0.784381833
## 139 0.0008403665 0.03100797 0.968151668
## 140 0.1451337253 0.72397924 0.130887030
## 141 0.3292054158 0.62127724 0.049517341
## 142 0.1451337253 0.72397924 0.130887030
## 143 0.9222088705 0.07563906 0.002152066
## 144 0.5865514773 0.39574545 0.017703072
## 145 0.0024254173 0.08441050 0.913164086
## 146 0.5865514773 0.39574545 0.017703072
## 147 0.5865514773 0.39574545 0.017703072
## 148 0.8039608004 0.18984337 0.006195829
## 149 0.5865514773 0.39574545 0.017703072
## 150 0.0069792170 0.20863895 0.784381833
## 151 0.0024254173 0.08441050 0.913164086
## 152 0.1451337253 0.72397924 0.130887030
## 153 0.3292054158 0.62127724 0.049517341
## 154 0.5865514773 0.39574545 0.017703072
## 155 0.8039608004 0.18984337 0.006195829
## 156 0.1451337253 0.72397924 0.130887030
## 157 0.0554724713 0.64122702 0.303300510
## 158 0.5865514773 0.39574545 0.017703072
## 159 0.1451337253 0.72397924 0.130887030
## 160 0.5865514773 0.39574545 0.017703072
## 161 0.0554724713 0.64122702 0.303300510
## 162 0.3292054158 0.62127724 0.049517341
## 163 0.0199122614 0.42286989 0.557217849
## 164 0.3292054158 0.62127724 0.049517341
## 165 0.3292054158 0.62127724 0.049517341
## 166 0.0554724713 0.64122702 0.303300510
## 167 0.0069792170 0.20863895 0.784381833
## 168 0.5865514773 0.39574545 0.017703072
## 169 0.1451337253 0.72397924 0.130887030
## 170 0.5865514773 0.39574545 0.017703072
## 171 0.0199122614 0.42286989 0.557217849
## 172 0.5865514773 0.39574545 0.017703072
## 173 0.0024254173 0.08441050 0.913164086
## 174 0.0069792170 0.20863895 0.784381833
## 175 0.0199122614 0.42286989 0.557217849
##13.7 Goodness-of-Fit dan Proportional Odds Model cumulative logit mengasumsikan bahwa efek prediktor (kecepatan layanan) sama untuk setiap cutoff dari tingkat kepuasan pelanggan. Jika asumsi ini tidak terpenuhi, kita dapat mempertimbangkan model non-proportional odds seperti generalized ordinal model.
Selain cumulative logit, terdapat beberapa model ordinal lain yang bisa dipertimbangkan:
Adjacent-category logit
Continuation-ratio (sequential) logit
Model-model ini berguna apabila asumsi proportional odds tidak terpenuhi pada data kepuasan pelanggan terhadap kecepatan layanan.
Regresi ordinal efektif digunakan ketika variabel respon bersifat berurutan, seperti tingkat kepuasan pelanggan: Tidak Puas, Puas, Sangat Puas.
Model cumulative logit menginterpretasikan pengaruh kecepatan layanan dalam bentuk log-odds kumulatif atas tingkat kepuasan.
Implementasi di R dapat dilakukan menggunakan fungsi polr() dari package MASS.
Jika dibutuhkan validasi model lebih lanjut, dapat digunakan uji devian atau likelihood ratio test.
Model regresi logistik ordinal yang paling umum digunakan adalah Cumulative Logit Model dengan asumsi Proportional Odds.
Asumsi ini juga dikenal sebagai asumsi paralelisme (parallel lines assumption).
Asumsi paralelisme menyatakan bahwa koefisien regresi (\(\beta\)) untuk prediktor kecepatan layanan dianggap sama di setiap cutoff kumulatif dari tingkat kepuasan pelanggan.
Bentuk umum model:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
Untuk \(j = 1, 2, \dots, c - 1\):
Visualisasi: Dalam asumsi paralelisme, kurva logit kumulatif dari tiap kategori terhadap prediktor akan memiliki kemiringan yang sama (paralel), hanya berbeda posisi (intercept).
Konsekuensi Pelanggaran Asumsi
Jika asumsi ini tidak terpenuhi:
Pengujian Asumsi Paralelisme
Untuk memeriksa validitas asumsi, dapat digunakan:
Kesimpulan
• Asumsi paralelisme penting untuk validitas model cumulative logit.
• Menyederhanakan interpretasi karena efek prediktor konstan.
• Jika tidak terpenuhi, gunakan model ordinal alternatif.
Analisis Data Kategorikal: Peranan, Metode, dan Pendekatan Analisis data kategorikal sangat penting dalam statistika terapan, karena banyak fenomena di dunia nyata menghasilkan data dalam bentuk kategori. Contoh umumnya mencakup jenis kelamin, status pekerjaan, tingkat pendidikan, preferensi konsumen, serta diagnosis medis. Untuk menganalisis data seperti ini, digunakan beberapa pendekatan, antara lain tabel kontingensi, model log-linier, dan model regresi logistik. Masing-masing metode memiliki keunggulan dan keterbatasan tergantung pada tujuan analisis dan struktur data yang tersedia.
Tabel Kontingensi Tabel kontingensi umumnya menjadi langkah awal dalam mengeksplorasi hubungan antara dua atau lebih variabel kategorikal. Misalnya, dalam studi mengenai pengaruh obat terhadap serangan jantung, tabel kontingensi bisa menunjukkan jumlah pasien yang mengalami atau tidak mengalami serangan jantung menurut jenis obat yang dikonsumsi. Melalui tabel ini, kita dapat mengidentifikasi pola awal, serta menghitung ukuran asosiasi seperti odds ratio, risk ratio, dan statistik chi-square untuk menguji apakah terdapat hubungan independen antar variabel.
Model Log-linier Untuk analisis yang lebih kompleks—terutama ketika ingin mengendalikan pengaruh berbagai variabel dan interaksinya secara bersamaan—model log-linier menjadi sangat berguna. Model ini merupakan bentuk khusus dari Generalized Linear Model (GLM) yang diterapkan pada frekuensi sel dalam tabel kontingensi dan biasanya mengasumsikan distribusi Poisson.
Berbeda dari regresi logistik, model log-linier tidak membedakan antara variabel dependen dan independen; semua variabel diperlakukan secara simetris. Ini menjadikannya cocok untuk mengeksplorasi struktur asosiasi atau independensi antar variabel, bukan untuk prediksi. Model ini terdiri dari efek utama dari masing-masing variabel, serta interaksi antar variabel. Misalnya, dalam tabel tiga arah yang melibatkan jenis kelamin, status merokok, dan penyakit paru-paru, model log-linier dapat membantu menentukan apakah cukup mempertimbangkan interaksi dua variabel saja, atau diperlukan interaksi tiga arah untuk memahami struktur asosiasi. Pengujian kecocokan model dilakukan menggunakan uji rasio kemungkinan (likelihood ratio test) untuk membandingkan model yang lebih sederhana dengan yang lebih kompleks.
Model Regresi Logistik Sebaliknya, regresi logistik sangat sesuai ketika satu variabel kategorikal dianggap sebagai variabel dependen (contohnya: apakah seseorang mengalami penyakit atau tidak), sementara variabel lain—baik kategorikal maupun numerik—bertindak sebagai prediktor. Model ini menganalisis logit (log odds) dari probabilitas terjadinya suatu peristiwa.
Regresi logistik banyak digunakan dalam penelitian observasional maupun eksperimental untuk menjelaskan atau meramalkan peluang terjadinya suatu hasil. Selain itu, regresi logistik juga memiliki varian untuk outcome dengan lebih dari dua kategori, yaitu regresi logistik multinomial dan regresi logistik ordinal.
Tabel Kontingensi
Tabel kontingensi menyajikan jumlah frekuensi dari kombinasi kategori antar variabel.
Contoh tabel 2x2:
table_data <- matrix(c(35, 12, 8, 5), nrow = 2,
dimnames = list(
Treatment = c("Kemoterapi", "Imunoterapi"),
Outcome = c("Berhasil", "Gagal")
)
)
# Menampilkan tabel
table_data
## Outcome
## Treatment Berhasil Gagal
## Kemoterapi 35 8
## Imunoterapi 12 5
Tabel kontingensi bersifat deskriptif dan tidak melibatkan pemodelan probabilitas
Model Loglinear
Model loglinear memodelkan logaritma dari ekspektasi frekuensi sel dalam tabel kontingensi.
\[ \log(\mu_{ij}) = \mu + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Cocok untuk menyelidiki asosiasi dan independensi antar variabel.
Tidak membedakan antara variabel respon dan penjelas.
Umumnya digunakan pada tabel multi-dimensi (2 arah, 3 arah, dst).
library(MASS)
# Model log-linier dengan nama dimnames yang baru
loglm(~ Treatment + Outcome, data = table_data)
## Call:
## loglm(formula = ~Treatment + Outcome, data = table_data)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.8038937 1 0.3699318
## Pearson 0.8383915 1 0.3598572
Model Regresi Logistik
Model regresi logistik biner:
\[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_1 x \]
Contoh:
data_glm <- data.frame(
Outcome = c(1, 0, 1, 0),
Treatment = factor(c("Kemoterapi", "Kemoterapi", "Imunoterapi", "Imunoterapi")),
Frek = c(35, 12, 8, 5)
)
# Membuat model regresi logistik
model_logit <- glm(Outcome ~ Treatment, weights = Frek, family = binomial, data = data_glm)
# Menampilkan ringkasan model
summary(model_logit)
##
## Call:
## glm(formula = Outcome ~ Treatment, family = binomial, data = data_glm,
## weights = Frek)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.4700 0.5701 0.824 0.410
## TreatmentKemoterapi 0.6004 0.6610 0.908 0.364
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 71.529 on 3 degrees of freedom
## Residual deviance: 70.725 on 2 degrees of freedom
## AIC: 74.725
##
## Number of Fisher Scoring iterations: 4
Perbandingan Ketiga Pendekatan
| Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
|---|---|---|---|
| Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
| Variabel dependen | Tidak ada | Tidak ada (simetris) | Ada (eksplisit) |
| Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial (probabilitas) |
| Bentuk Model | Tidak ada | GLM: log(μ) ~ efek | GLM: logit(p) ~ prediktor |
| Cocok untuk | Eksplorasi awal | Tabel > 2 variabel | Studi prediktif |
Tabel kontingensi menyajikan frekuensi dari kombinasi kategori antar dua atau lebih variabel. Misal:
# Contoh tabel 2x2
matrix(c(35, 12, 8, 5), nrow = 2,
dimnames = list(
Treatment = c("Kemoterapi", "Imunoterapi"),
Outcome = c("Berhasil", "Gagal")
)
)
## Outcome
## Treatment Berhasil Gagal
## Kemoterapi 35 8
## Imunoterapi 12 5
Model log-linier untuk tabel I x J dapat dituliskan: \[ \log(\mu_{ij}) = \mu + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Model saturated atau model penuh menyertakan seluruh efek utama dan interaksi:
• Cocok sempurna terhadap data
• Tidak mengasumsikan independensi antar variabel
Contoh formulasi untuk tabel 2x2:
# Data
library(MASS)
table_data <- matrix(c(35, 12, 8, 5), nrow = 2,
dimnames = list(
Treatment = c("Kemoterapi", "Imunoterapi"),
Outcome = c("Berhasil", "Gagal")
)
)
ftable(table_data)
## Outcome Berhasil Gagal
## Treatment
## Kemoterapi 35 8
## Imunoterapi 12 5
Model saturated dapat dipasang dengan loglm dari package
{MASS}:
model_saturated <- loglm(~ Treatment * Outcome, data = table_data)
# Menampilkan ringkasan model
summary(model_saturated)
## Formula:
## ~Treatment * Outcome
## attr(,"variables")
## list(Treatment, Outcome)
## attr(,"factors")
## Treatment Outcome Treatment:Outcome
## Treatment 1 0 1
## Outcome 0 1 1
## attr(,"term.labels")
## [1] "Treatment" "Outcome" "Treatment:Outcome"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model independen mengasumsikan bahwa tidak ada interaksi antara variabel: \[ \log(\mu_{ij}) = \mu + \lambda^T_i + \lambda^B_j \] Model ini menguji hipotesis bahwa variabel X dan Y saling independen.
model_indep <- loglm(~ Treatment * Outcome, data = table_data)
summary(model_indep)
## Formula:
## ~Treatment * Outcome
## attr(,"variables")
## list(Treatment, Outcome)
## attr(,"factors")
## Treatment Outcome Treatment:Outcome
## Treatment 1 0 1
## Outcome 0 1 1
## attr(,"term.labels")
## [1] "Treatment" "Outcome" "Treatment:Outcome"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Odds ratio untuk tabel 2x2:
\[ OR = \frac{n_{11}n_{22}}{n_{12}n_{21}} \]
Interpretasi nilai OR:
Dalam model saturated:
# Estimasi odds ratio dan log-odds
logOR <- log((table_data[1,1] * table_data[2,2]) / (table_data[1,2] * table_data[2,1]))
# Tampilkan logOR
logOR
## [1] 0.6004378
Perbandingan antar model dilakukan dengan menggunakan statistik deviance (G²) atau likelihood ratio test.
anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Treatment * Outcome
## Model 2:
## ~Treatment * Outcome
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 0 0
## Model 2 0 0 0 0 1
## Saturated 0 0 0 0 1
dan pola keterkaitan antara dua atau lebih variabel yang bersifat kategorik. Data yang dianalisis dengan model ini umumnya disajikan dalam bentuk tabel kontingensi, yaitu tabel yang mencatat frekuensi observasi untuk setiap kombinasi kategori dari variabel-variabel tersebut.
Berbeda dengan model regresi linier yang digunakan untuk memodelkan hubungan antara variabel dependen kontinu dan variabel prediktor, model log-linear memodelkan logaritma dari nilai ekspektasi frekuensi dalam setiap sel tabel kontingensi. Dengan kata lain, bukan frekuensinya langsung yang dimodelkan, melainkan logaritma dari rata-rata atau harapan frekuensi tiap kombinasi kategori. Notasi umum yang digunakan adalah \(\mu_{ij}\) untuk melambangkan nilai ekspektasi frekuensi pada sel dengan kombinasi kategori ke-i dan ke-j.
\[
\log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij}
\]
Model log-linear merupakan pendekatan statistik yang dirancang khusus untuk menganalisis data dalam bentuk frekuensi atau hitungan yang disajikan di dalam tabel kontingensi. Tujuan utama model ini adalah untuk mengevaluasi pola hubungan atau asosiasi di antara dua atau lebih variabel yang bersifat kategorik. Yang menarik dari model ini adalah bahwa ia tidak membedakan antara variabel sebagai respon (dependen) atau sebagai prediktor (independen). Semua variabel diperlakukan secara setara dalam proses pemodelan. Fokusnya terletak pada bagaimana interaksi dan efek utama dari variabel-variabel tersebut berkontribusi terhadap struktur frekuensi yang diamati.
model regresi logistik digunakan dalam konteks yang berbeda, yakni ketika kita ingin memodelkan probabilitas terjadinya suatu peristiwa atau outcome, yang biasanya bersifat biner (misalnya: sukses/gagal, hadir/tidak hadir, positif/negatif). Dalam model ini, terdapat pemisahan peran variabel, di mana satu variabel ditetapkan sebagai variabel respon (dependent variable), sementara satu atau lebih variabel lain bertindak sebagai prediktor (independent variables). Prediktor ini dapat berupa variabel kategorik maupun kontinu. Model regresi logistik menghubungkan prediktor dengan probabilitas outcome melalui fungsi logit, memungkinkan analisis mengenai bagaimana perubahan prediktor memengaruhi kemungkinan terjadinya outcome.
Sistem Persamaan Model Log-Linear
\[ \begin{align*} \log(\mu_{11}) &= \lambda + \lambda^A_1 + \lambda^B_1 + \lambda^{AB}_{11} \\ \log(\mu_{12}) &= \lambda + \lambda^A_1 + \lambda^B_2 + \lambda^{AB}_{12} \\ \log(\mu_{21}) &= \lambda + \lambda^A_2 + \lambda^B_1 + \lambda^{AB}_{21} \\ \log(\mu_{22}) &= \lambda + \lambda^A_2 + \lambda^B_2 + \lambda^{AB}_{22} \end{align*} \] Constraint Sum-to-Zero
\[ \lambda^A_1 + \lambda^A_2 = 0 \\ \lambda^B_1 + \lambda^B_2 = 0 \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} = 0 \]
Rumus Estimasi Parameter dengan Sum-to-Zero Constraint
\[ \lambda^A_1 = \frac{1}{2} \left[ (\log \mu_{11} + \log \mu_{12}) - (\log \mu_{21} + \log \mu_{22}) \right] \]
\[ \lambda^B_1 = \frac{1}{2} \left[ (\log \mu_{11} + \log \mu_{21}) - (\log \mu_{12} + \log \mu_{22}) \right] \]
\[ \lambda^{AB}_{12} = \frac{1}{4} \left[ \log \mu_{12} - \log \mu_{11} - \log \mu_{22} + \log \mu_{21} \right] \]
Diberikan data:
| Terkena Flu | Tidak Terkena Flu | Total | |
|---|---|---|---|
| Sudah Vaksin | 2 | 18 | 20 |
| Belum Vaksin | 5 | 10 | 15 |
| Total | 7 | 28 | 35 |
Model log-linear pada tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
dengan constraint sum-to-zero:
\[ \sum_i \lambda^A_i = 0,\quad \sum_j \lambda^B_j = 0,\quad \sum_{i,j} \lambda^{AB}_{ij} = 0 \]
Misalkan:
Observasi:
\(n_{11} = 2\)
\(n_{12} = 18\)
\(n_{21} = 5\)
\(n_{22} = 10\)
\(\log(2) = 0.6931\)
\(\log(18) = 2.8904\)
\(\log(5) = 1.6094\)
\(\log(10) = 2.3026\)
$$
Dengan constraint sum-to-zero:
\[ \lambda^A_1 + \lambda^A_2 = 0,\quad \\ \lambda^B_1 + \lambda^B_2 = 0,\quad \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} = 0 \]
Langkah-langkah:
1. Hitung rata-rata log frekuensi sel:
\[ \lambda = \frac{1}{4} \sum_{i=1}^{2} \sum_{j=1}^{2} \log(n_{ij}) \\ = \frac{1}{4} (\log(2) + \log(18) + \log(5) + \log(10)) \\ = \frac{1}{4} (0.6931 + 2.8904 + 1.6094 + 2.3026) \\ = \frac{1}{4} (7.4955) \\ = 1.8739 \]
2. Efek utama A :
\[ lambda^A_1 = \frac{1}{2} \left[ (\log(2) + \log(18)) - (\log(5) + \log(10)) \right] \\ = \frac{1}{2} \left[ (0.6931 + 2.8904) - (1.6094 + 2.3026) \right] \\ = \frac{1}{2} (3.5835 - 3.9120) \\ = \frac{1}{2} (-0.3285) \\ = -0.1643 \]
\[ \lambda^A_2 = -0.1643 \]
3. Efek utama B :
\[ \lambda^B_1 = \frac{1}{2} \left[ (\log(2) + \log(5)) - (\log(18) + \log(10)) \right] \\ = \frac{1}{2} \left[ (0.6931 + 1.6094) - (2.8904 + 2.3026) \right] \\ = \frac{1}{2} (2.3025 - 5.1930) \\ = \frac{1}{2} (-2.8905) \\ = -1.4453 \]
\[ \lambda^B_2 = -1.4453 \]
4. Efek interaksi:
\[ \lambda^{AB}_{11} = \frac{1}{4}[\log(2) - \log(18) - \log(5) + \log(10)] \\ = \frac{1}{4}[0.6931 - 2.8904 - 1.6094 + 2.3026] \\ = \frac{1}{4}(-1.5041) \\ = -0.3760 \\ \\ \lambda^{AB}_{12} = -\lambda^{AB}_{11} = 0.3760 \\ \lambda^{AB}_{21} = 0.3760 \]
\[ \lambda^{AB}_{22} = -1.1809 \]
Ringkasan parameter:
\[ \lambda = 1.8739 \]
\[ \lambda^A_1 = - 0.1643, \quad \lambda^A_2 = 0.1643 \]
\[ \lambda^B_1 =-1.4453, \quad \lambda^B_2 = 1.4453 \]
\[ \lambda^{AB}_{11} = \log(2) - \lambda - \lambda^A_1 - \lambda^B_1 \\ = 0.6931 - 1.8739 - (-0.1643) - (-1.4453) \\ = 0.6931 - 1.8739 + 0.1643 + 1.4453 \\ = 0.4288 \]
\[ \lambda^{AB}_{12} = \log(18) - \lambda - \lambda^A_1 - \lambda^B_2 \\ = 2.8904 - 1.8739 - (-0.1643) - (1.4453) \\ = 2.8904 - 1.8739 + 0.1643 - 1.4453 \\ = -0.2645 \]
\[ \lambda^{AB}_{21} = \log(5) - \lambda - \lambda^A_2 - \lambda^B_1 \\ = 1.6094 - 1.8739 - (0.1643) - (-1.4453) \\ = 1.6094 - 1.8739 - 0.1643 + 1.4453 \\ = 1.0165 \]
\[ \lambda^{AB}_{22} = \log(10) - \lambda - \lambda^A_2 - \lambda^B_2 \\ = 2.3026 - 1.8739 - (0.1643) - (1.4453) \\ = 2.3026 - 1.8739 - 0.1643 - 1.4453 \\ = -1.1809 \]
\[ \text{OR} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{2 \times 10}{18 \times 5} = \frac{20}{90} = 0.2222 \]
Log odds ratio:
\[ \log(\text{OR}) = \log(0.2222) = -1.5041 \]
Standard error (SE):
\[ SE = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} \]
$$
SE = \ = \ = \ = 0.9250 $$
95% Confidence Interval for log(OR):
\[ \log(OR) \pm 1.96 \times SE = 0.3222 \pm 1.96 \times 0.9734 \\ = 0.3222 \pm 1.9069 \\ \]
\[ = (0.3222 - 1.9079,\ 0.3222 + 1.9079) \\ = (-1.5857,\ 2.2301) \] Back-transform to get CI for OR:
\[ \text{Lower limit} = 0.3222 - 1.9069 = -1.5847 \\ \]
\[ \text{Upper limit} = 0.3222 + 1.9069 = 2.229 \]
Jadi, OR = 6 (95% CI: -1.5847 – 2.229)
# Data 2x2 - Vaksinasi Influenza dan Kejadian Flu
tabel <- matrix(c(2, 18, 5, 10), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Terkena Flu", "Tidak Terkena Flu")
rownames(tabel) <- c("Sudah Vaksin", "Belum Vaksin")
tabel
## Terkena Flu Tidak Terkena Flu
## Sudah Vaksin 2 18
## Belum Vaksin 5 10
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Metode", "Status", "Freq")
data
# Model tanpa interaksi
fit_no_inter <- glm(Freq ~ Metode + Status, family = poisson(), data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Metode + Status, family = poisson(), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.3863 0.4053 3.420 0.000626 ***
## MetodeBelum Vaksin -0.2877 0.3416 -0.842 0.399650
## StatusTidak Terkena Flu 1.3863 0.4226 3.281 0.001036 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 17.1383 on 3 degrees of freedom
## Residual deviance: 2.9294 on 1 degrees of freedom
## AIC: 23.918
##
## Number of Fisher Scoring iterations: 5
# Model dengan interaksi
fit_inter <- glm(Freq ~ Metode * Status, family = poisson(), data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Metode * Status, family = poisson(), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.6931 0.7071 0.980 0.3270
## MetodeBelum Vaksin 0.9163 0.8367 1.095 0.2734
## StatusTidak Terkena Flu 2.1972 0.7454 2.948 0.0032
## MetodeBelum Vaksin:StatusTidak Terkena Flu -1.5041 0.9250 -1.626 0.1039
##
## (Intercept)
## MetodeBelum Vaksin
## StatusTidak Terkena Flu **
## MetodeBelum Vaksin:StatusTidak Terkena Flu
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.7138e+01 on 3 degrees of freedom
## Residual deviance: -4.4409e-16 on 0 degrees of freedom
## AIC: 22.989
##
## Number of Fisher Scoring iterations: 3
Parameter utama (intercept) menunjukkan rata-rata log frekuensi sel.
Efek “Metode” dan “Status” menunjukkan perbedaan log frekuensi antar kategori.
Nilai log(2.1) = 0.7419 sama dengan efek interaksi output R
Suatu survei dilakukan untuk mengetahui hubungan antara Jenis Kelamin (perokok/tidak peroko) dan Kategori penyakit jantung :
| Tidak Ada Penyakit Jantung | Penyakit Jantung Ringan | Penyakit Jantung Berat |
|—————|—————————|————————|———————–| | Perokok | 20 | 15 | 25 | | Bukan Perokok | 35 | 10 | 5 |
Data merupakan data simulasi
Bentuk umum model log-linear untuk tabel 2x3 (dengan sum-to-zero constraint):
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
dengan:
Constraint: \[ \sum_i \lambda^A_i = 0,\quad \sum_j \lambda^B_j = 0,\quad \sum_i \lambda^{AB}_{ij} = 0,\quad \sum_j \lambda^{AB}_{ij} = 0 \]
Secara eksplisit:
\[
\log(\mu_{ij}) =
\lambda +
\begin{cases}
\lambda^A_1 & \text{(perokok)} \\
\lambda^A_2 & \text{(tidak perokok)}
\end{cases}
+
\begin{cases}
\lambda^B_1 & \text{(tidak ada)} \\
\lambda^B_2 & \text{(sedang )} \\
\lambda^B_3 & \text{(berat)}
\end{cases}
+
\lambda^{AB}_{ij} \text{ (interaksi jika ada)}
\]
# Membuat data frame dari tabel (Perokok vs Penyakit Jantung)
tabel2x3 <- matrix(c(20, 15, 25, # Perokok
35, 10, 5), # Bukan Perokok
nrow = 2, byrow = TRUE)
# Menentukan nama kolom dan baris
colnames(tabel2x3) <- c("Tidak Ada Penyakit Jantung", "Penyakit Jantung Ringan", "Penyakit Jantung Berat")
rownames(tabel2x3) <- c("Perokok", "Bukan Perokok")
# Menampilkan tabel
tabel2x3
## Tidak Ada Penyakit Jantung Penyakit Jantung Ringan
## Perokok 20 15
## Bukan Perokok 35 10
## Penyakit Jantung Berat
## Perokok 25
## Bukan Perokok 5
# Membuat tabel (Perokok vs Penyakit Jantung)
tabel2x3 <- matrix(c(20, 15, 25, # Perokok
35, 10, 5), # Bukan Perokok
nrow = 2, byrow = TRUE)
# Nama kolom dan baris
colnames(tabel2x3) <- c("TidakAdaPJ", "PJRingan", "PJBerat")
rownames(tabel2x3) <- c("Perokok", "BukanPerokok")
# Ubah ke data.frame untuk GLM
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("StatusMerokok", "KategoriPenyakit", "Freq")
# Tampilkan data
data2x3
# Model log-linear tanpa interaksi (asumsi independen)
fit_no_inter <- glm(Freq ~ StatusMerokok + KategoriPenyakit, family = poisson(), data = data2x3)
# Lihat ringkasan model
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ StatusMerokok + KategoriPenyakit, family = poisson(),
## data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.4012 0.1605 21.192 < 2e-16 ***
## StatusMerokokBukanPerokok -0.1823 0.1915 -0.952 0.34102
## KategoriPenyakitPJRingan -0.7885 0.2412 -3.269 0.00108 **
## KategoriPenyakitPJBerat -0.6061 0.2270 -2.671 0.00757 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 33.116 on 5 degrees of freedom
## Residual deviance: 18.795 on 2 degrees of freedom
## AIC: 54.293
##
## Number of Fisher Scoring iterations: 5
# Model log-linear dengan interaksi (untuk cek asosiasi)
fit_inter <- glm(Freq ~ StatusMerokok * KategoriPenyakit, family = poisson(), data = data2x3)
# Lihat ringkasan model
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ StatusMerokok * KategoriPenyakit, family = poisson(),
## data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 2.9957 0.2236 13.397
## StatusMerokokBukanPerokok 0.5596 0.2803 1.996
## KategoriPenyakitPJRingan -0.2877 0.3416 -0.842
## KategoriPenyakitPJBerat 0.2231 0.3000 0.744
## StatusMerokokBukanPerokok:KategoriPenyakitPJRingan -0.9651 0.4952 -1.949
## StatusMerokokBukanPerokok:KategoriPenyakitPJBerat -2.1691 0.5644 -3.843
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## StatusMerokokBukanPerokok 0.045885 *
## KategoriPenyakitPJRingan 0.399650
## KategoriPenyakitPJBerat 0.456990
## StatusMerokokBukanPerokok:KategoriPenyakitPJRingan 0.051318 .
## StatusMerokokBukanPerokok:KategoriPenyakitPJBerat 0.000122 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3.3116e+01 on 5 degrees of freedom
## Residual deviance: 3.5527e-15 on 0 degrees of freedom
## AIC: 39.498
##
## Number of Fisher Scoring iterations: 3
Berdasarkan hasil model log-linear dengan interaksi dan perbandingan model, dapat disimpulkan bahwa:
terdapat hubungan yang signifikan antara Status Merokok dan Kejadian Penyakit Jantung.
dengan kata lain, Status Merokok mempengaruhi distribusi kategori Penyakit Jantung:
Perokok lebih cenderung mengalami Penyakit Jantung Berat.
Bukan Perokok lebih cenderung tidak mengalami penyakit jantung.
Model log-linear untuk tabel kontingensi tiga arah merupakan model yang mencakup tiga variabel kategorik, sehingga memungkinkan berbagai macam pola interaksi yang lebih kompleks di dalam model tersebut. Pada model ini, interaksi tertinggi yang dapat dianalisis adalah interaksi tiga arah, yaitu interaksi yang melibatkan ketiga variabel secara bersamaan.
Model log-linear yang melibatkan tiga variabel kategorik — misalnya variabel X, Y, dan Z — adalah model statistik yang digunakan untuk menganalisis hubungan atau ketergantungan antar variabel dalam sebuah tabel kontingensi tiga arah. Dalam model ini, struktur hubungan antara variabel dapat dibangun dengan berbagai tingkat kompleksitas, tergantung pada tingkat interaksi yang ingin dimasukkan ke dalam model.
Secara umum, model log-linear tiga arah memungkinkan peneliti untuk mengeksplorasi berbagai pola keterkaitan di antara ketiga variabel. Ada beberapa bentuk model yang dapat dibangun, mulai dari model aditif sederhana (yang hanya mempertimbangkan pengaruh masing-masing variabel secara individual), hingga model interaksi penuh (yang mempertimbangkan interaksi simultan antara ketiga variabel).
1. Model Saturated
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
Model ini memuat semua kemungkinan interaksi, termasuk interaksi tiga arah (X, Y, dan Z).
2. Model Homogen
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Model ini hanya mengakomodasi interaksi dua arah antar variabel tanpa memasukkan interaksi tiga arah.
3. Model Conditional
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \] interaksi X dengan Y dan X dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \] interaksi Y dengan X dan Y dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
interaksi Z dengan X dan Z dengan Y.
4. Model Joint Independence
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
5. Model Tanpa Interaksi
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k \] Model ini hanya memasukkan efek utama tanpa interaksi antar variabel.
Dalam analisis model log-linear tiga arah, pengujian interaksi dilakukan untuk mengetahui ada atau tidaknya interaksi antar variabel. Pengujian ini dilakukan secara bertahap, dimulai dari tingkat interaksi tertinggi ke yang lebih rendah. Untuk model log-linear dengan tiga peubah (X, Y, dan Z), tahapan pengujian meliputi:
1) Pengujian Interaksi Tiga Arah (XYZ):
2) Pengujian Interaksi Dua Arah (XY, XZ, YZ):
Bandingkan model homogenous dengan model conditional.
Bandingkan model conditional dengan model joint independence.
Bandingkan model joint independence dengan model tanpa interaksi.
Setiap tahapan pengujian dilakukan untuk menilai kecocokan model dan menentukan struktur interaksi mana yang paling sesuai dengan data yang diamati.
install.packages("kableExtra")
## Warning: package 'kableExtra' is in use and will not be installed
library (kableExtra)
Tabel berikut menunjukkan data mengenai peristiwa pertama kali melakukan hubungan seksual pada remaja berusia 15 dan 16 tahun berdasarkan ras dan jenis kelamin.
\[ \begin{array}{|c|c|c|c|} \hline \textbf{Kategori Sekolah} & \textbf{Jenis Kelamin} & \textbf{Sarapan (Ya)} & \textbf{Tidak Sarapan (No)} \\ \hline \text{SMA Negeri} & \text{Laki-laki} & 120 & 30 \\ \text{SMA Negeri} & \text{Perempuan} & 140 & 25 \\ \text{SMA Swasta} & \text{Laki-laki} & 85 & 45 \\ \text{SMA Swasta} & \text{Perempuan} & 95 & 55 \\ \hline \end{array} \]
library("epitools")
library("DescTools")
library("lawstat")
## Warning: package 'lawstat' was built under R version 4.4.3
Input Data
# Input data sesuai tabel kategori sekolah
z.sekolah <- factor(rep(c("SMA Negeri", "SMA Swasta"), each = 4))
x.jenis_kelamin <- factor(rep(c("Laki-laki", "Perempuan"), each = 2, times = 2))
y.sarapan <- factor(rep(c("Ya", "Tidak"), times = 4))
counts <- c(120, 30, 140, 25, 85, 45, 95, 55)
data <- data.frame(
Sekolah = z.sekolah,
Jenis_Kelamin = x.jenis_kelamin,
Sarapan = y.sarapan,
Frekuensi = counts
)
data
Membentuk Tabel Kontigensi 3 Arah
# Tabel 3D: Sekolah x Jenis Kelamin x Sarapan
table3d <- xtabs(Frekuensi ~ Sekolah + Jenis_Kelamin + Sarapan, data = data)
# Tampilkan dalam format flat table
ftable(table3d)
## Sarapan Tidak Ya
## Sekolah Jenis_Kelamin
## SMA Negeri Laki-laki 30 120
## Perempuan 25 140
## SMA Swasta Laki-laki 45 85
## Perempuan 55 95
Analisis Log-Linear: Tahap Pemodelan Kita akan memodelkan tabel ini menggunakan beberapa model log-linear dan membandingkan kecocokan model (parsimonious model)
# Atur referensi baseline untuk Jenis Kelamin (x.sex) menjadi "Perempuan"
data$Jenis_Kelamin <- relevel(data$Jenis_Kelamin, ref = "Perempuan")
# Atur referensi baseline untuk Sarapan (y.sarapan) menjadi "Tidak"
data$Sarapan <- relevel(data$Sarapan, ref = "Tidak")
# Atur referensi baseline untuk Sekolah (z.school) menjadi "SMA Negeri"
data$Sekolah <- relevel(data$Sekolah, ref = "SMA Negeri")
Model Saturated Model log-linear saturated memasukkan semua interaksi hingga tiga arah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
# Model saturated: semua efek utama + interaksi hingga 3 arah
model_saturated <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin:y.sarapan + x.jenis_kelamin:z.sekolah + y.sarapan:z.sekolah +
x.jenis_kelamin:y.sarapan:z.sekolah,
family = poisson(link = "log"))
# Ringkasan model
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin:y.sarapan + x.jenis_kelamin:z.sekolah + y.sarapan:z.sekolah +
## x.jenis_kelamin:y.sarapan:z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 3.4012 0.1826
## x.jenis_kelaminPerempuan -0.1823 0.2708
## y.sarapanYa 1.3863 0.2041
## z.sekolahSMA Swasta 0.4055 0.2357
## x.jenis_kelaminPerempuan:y.sarapanYa 0.3365 0.2980
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.3830 0.3372
## y.sarapanYa:z.sekolahSMA Swasta -0.7503 0.2751
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta -0.4259 0.3892
## z value Pr(>|z|)
## (Intercept) 18.629 < 2e-16 ***
## x.jenis_kelaminPerempuan -0.673 0.50078
## y.sarapanYa 6.791 1.11e-11 ***
## z.sekolahSMA Swasta 1.720 0.08539 .
## x.jenis_kelaminPerempuan:y.sarapanYa 1.129 0.25887
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 1.136 0.25611
## y.sarapanYa:z.sekolahSMA Swasta -2.728 0.00637 **
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta -1.094 0.27385
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.7371e+02 on 7 degrees of freedom
## Residual deviance: -5.1070e-15 on 0 degrees of freedom
## AIC: 63.888
##
## Number of Fisher Scoring iterations: 3
exp(model_saturated$coefficients)
## (Intercept)
## 30.0000000
## x.jenis_kelaminPerempuan
## 0.8333333
## y.sarapanYa
## 4.0000000
## z.sekolahSMA Swasta
## 1.5000000
## x.jenis_kelaminPerempuan:y.sarapanYa
## 1.4000000
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta
## 1.4666667
## y.sarapanYa:z.sekolahSMA Swasta
## 0.4722222
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta
## 0.6531704
Model yang digunakan adalah model log-linear saturated dengan semua efek utama, interaksi dua arah, dan interaksi tiga arah. Model ini memodelkan hubungan antara jenis kelamin (x.jeniskelamin), perlakuan intercouse (y.sarapan), dan ras (z.sekolah) terhadap frekuensi responden.
library(kableExtra)
coef_saturated <- summary(model_saturated)$coefficients
exp(model_saturated$coefficients)
## (Intercept)
## 30.0000000
## x.jenis_kelaminPerempuan
## 0.8333333
## y.sarapanYa
## 4.0000000
## z.sekolahSMA Swasta
## 1.5000000
## x.jenis_kelaminPerempuan:y.sarapanYa
## 1.4000000
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta
## 1.4666667
## y.sarapanYa:z.sekolahSMA Swasta
## 0.4722222
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta
## 0.6531704
kable(coef_saturated, digits = 3, caption = "Koefisien Model Saturated") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Estimate | Std. Error | z value | Pr(>|z|) | |
|---|---|---|---|---|
| (Intercept) | 3.401 | 0.183 | 18.629 | 0.000 |
| x.jenis_kelaminPerempuan | -0.182 | 0.271 | -0.673 | 0.501 |
| y.sarapanYa | 1.386 | 0.204 | 6.791 | 0.000 |
| z.sekolahSMA Swasta | 0.405 | 0.236 | 1.720 | 0.085 |
| x.jenis_kelaminPerempuan:y.sarapanYa | 0.336 | 0.298 | 1.129 | 0.259 |
| x.jenis_kelaminPerempuan:z.sekolahSMA Swasta | 0.383 | 0.337 | 1.136 | 0.256 |
| y.sarapanYa:z.sekolahSMA Swasta | -0.750 | 0.275 | -2.728 | 0.006 |
| x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta | -0.426 | 0.389 | -1.094 | 0.274 |
coef_saturated <- summary(model_saturated)$coefficients
kable(
round(coef_saturated, 3),
caption = "Tabel Koefisien Model Saturated",
col.names = c("Estimate", "Std. Error", "z value", "Pr(>|z|)")
)
| Estimate | Std. Error | z value | Pr(>|z|) | |
|---|---|---|---|---|
| (Intercept) | 3.401 | 0.183 | 18.629 | 0.000 |
| x.jenis_kelaminPerempuan | -0.182 | 0.271 | -0.673 | 0.501 |
| y.sarapanYa | 1.386 | 0.204 | 6.791 | 0.000 |
| z.sekolahSMA Swasta | 0.405 | 0.236 | 1.720 | 0.085 |
| x.jenis_kelaminPerempuan:y.sarapanYa | 0.336 | 0.298 | 1.129 | 0.259 |
| x.jenis_kelaminPerempuan:z.sekolahSMA Swasta | 0.383 | 0.337 | 1.136 | 0.256 |
| y.sarapanYa:z.sekolahSMA Swasta | -0.750 | 0.275 | -2.728 | 0.006 |
| x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta | -0.426 | 0.389 | -1.094 | 0.274 |
Laki-laki
Tidak Sarapan
SMA Negeri
Jadi, exp(3.401) ≈ 30 adalah perkiraan frekuensi kasus untuk kombinasi tersebut.
Tidak signifikan → Perempuan vs Laki-laki tidak menunjukkan perbedaan yang bermakna secara statistik dalam frekuensi dasar, setelah mengontrol variabel lain.
exp(1.386) ≈ 4.00 → Peluang sarapan sekitar 4x lebih besar dibanding yang tidak sarapan, dalam konteks referensi lainnya.
Ini adalah efek utama paling signifikan.
exp(0.405) ≈ 1.5 → Sedikit lebih besar peluang di SMA Swasta dibanding SMA Negeri.
Tidak signifikan di level 0.05, tapi marginal (p < 0.10).
Artinya, efek sarapan tidak banyak berbeda antara laki-laki dan perempuan. - Perempuan × SMA Swasta (p = 0.256) Tidak signifikan.
Efek jenis kelamin terhadap frekuensi tidak bergantung pada jenis sekolah.
exp(-0.750) ≈ 0.47 → Frekuensi sarapan di SMA Swasta lebih rendah dibanding SMA Negeri, setelah kontrol variabel lain. - Interaksi 3 arah: Perempuan × Sarapan × SMA Swasta (p = 0.274) Tidak signifikan.
Tidak ada bukti kuat bahwa hubungan antara sarapan dan jenis kelamin berubah tergantung pada sekolah.
Residual deviance = 0 menunjukkan bahwa model saturated memiliki kecocokan sempurna terhadap data, karena semua kombinasi kategori variabel dimasukkan ke dalam model sehingga tidak ada sisa deviasi. Hal ini menandakan bahwa seluruh variasi dalam data telah berhasil dijelaskan oleh model tanpa error. AIC = 60.839 memberikan ukuran kompleksitas model, dan dapat digunakan sebagai dasar pembanding apabila ingin menguji model yang lebih sederhana (reduced model) untuk melihat apakah interaksi-interaksi tingkat tinggi benar-benar dibutuhkan tanpa mengorbankan kualitas pemodelan secara signifikan.
Efek utama yang paling signifikan adalah Sarapan “Ya” memiliki expected count 4,00 kali lebih besar dibanding Sarapan “Tidak”.
Tidak ditemukan bukti kuat interaksi tiga arah yang signifikan.
Ditemukan bukti kuat interaksi dua arah antara variabel Sarapan dan Sekolah yang signifikan.
Model yang lebih sederhana (tanpa interaksi tiga arah) perlu dipertimbangkan untuk model final yang lebih parsimonious.
Catatan interpretasi:
Nilai exp(coef) menyatakan rasio ekspektasi (expected count ratio) dibandingkan baseline.
Efek positif → menaikkan expected count; Efek negatif → menurunkan expected count.
Koefisien signifikan pada p-value < 0.05.
Model log-linear homogenous memasukkan semua efek utama dan semua interaksi dua arah, tanpa interaksi tiga arah. Secara matematis, model ini dapat dituliskan sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# Homogenous Model
model_homogenous <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + x.jenis_kelamin*z.sekolah + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + x.jenis_kelamin * z.sekolah +
## y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.30240 0.16675 19.804
## x.jenis_kelaminPerempuan 0.02344 0.19394 0.121
## y.sarapanYa 1.50834 0.17757 8.494
## z.sekolahSMA Swasta 0.56509 0.18868 2.995
## x.jenis_kelaminPerempuan:y.sarapanYa 0.08710 0.19121 0.456
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.06373 0.16830 0.379
## y.sarapanYa:z.sekolahSMA Swasta -0.96695 0.19393 -4.986
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.90381
## y.sarapanYa < 2e-16 ***
## z.sekolahSMA Swasta 0.00274 **
## x.jenis_kelaminPerempuan:y.sarapanYa 0.64873
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.70495
## y.sarapanYa:z.sekolahSMA Swasta 6.17e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.2009 on 1 degrees of freedom
## AIC: 63.089
##
## Number of Fisher Scoring iterations: 3
Pengujian ini menggunakan residual deviance dari kedua model (saturated dan homogenous).
H0: Tidak ada interaksi tiga arah
H1: Ada interaksi tiga arah
# Deviance antar model
model_homogenous$deviance
## [1] 1.200893
model_saturated$deviance
## [1] -5.107026e-15
Deviance.model <- model_homogenous$deviance - model_saturated$deviance
Deviance.model
## [1] 1.200893
# Derajat bebas = db model homogenous - db model saturated
derajat.bebas <- (model_homogenous$df.residual - model_saturated$df.residual)
derajat.bebas
## [1] 1
chi.tabel <- qchisq(1 - 0.05, df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Interpretasi Pada taraf nyata 5%, Ditemukan bahwa hasil pengujian adalah Terima H0
Rangkuman
Pengujian Ada Tidaknya Interaksi Tiga Arah (Saturated Model vs Homogenous Model)
Hipotesis:
Tingkat Signifikansi:
Statistik Uji:
\[ \Delta \text{Deviance} = \text{Deviance model homogenous} - \text{Deviance model saturated} = 1.200893 - 0.0 = 1.200893 \]
\[ df = df\ \text{model homogenous} - df\ \text{model saturated} = 1 - 0 = 1 \]
Daerah Penolakan:
Keputusan:
Interpretasi:
Model log-linear conditional pada X memasukkan efek utama dan interaksi dua arah antara X dengan Y dan X dengan Z, tanpa interaksi antara Y dengan Z maupun interaksi tiga arah
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
# Conditional Association on X
model_conditional_X <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan+ x.jenis_kelamin*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_X)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + x.jenis_kelamin * z.sekolah,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.69333 0.12817 28.815
## x.jenis_kelaminPerempuan 0.04207 0.17837 0.236
## y.sarapanYa 1.00552 0.13495 7.451
## z.sekolahSMA Swasta -0.14310 0.11983 -1.194
## x.jenis_kelaminPerempuan:y.sarapanYa 0.07204 0.18699 0.385
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.04779 0.16458 0.290
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.814
## y.sarapanYa 9.26e-14 ***
## z.sekolahSMA Swasta 0.232
## x.jenis_kelaminPerempuan:y.sarapanYa 0.700
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.772
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.714 on 7 degrees of freedom
## Residual deviance: 27.081 on 2 degrees of freedom
## AIC: 86.969
##
## Number of Fisher Scoring iterations: 4
• Hipotesis \[ H_0 : \lambda_{jk}^{YZ} = 0 \quad \text{(Tidak ada interaksi antara perlakuan Intercouse (Y) dan ras (Z))} \\ H_1 : \lambda_{jk}^{YZ} \ne 0 \quad \text{(Ada interaksi antara perlakuan Intercouse (Y) dan ras (Z))} \] • Taraf Signifikansi \[ \alpha = 5\% \]
• Statistik Uji \[ \Delta \text{Deviance} = \text{Deviance model conditional on } X - \text{Deviance model homogenous}\\ \] \[ = 27.081 - 1.200893 = 25.880107\\ \] \[ db = db_{\text{model conditional on } X} - db_{\text{model homogenous}} \\= 2- 1 = 1 \]
• Daerah Penolakan \[ \text{Tolak } H_0 \text{ jika } \Delta \text{Deviance} > \chi^2_{0.05, 1} = 1.200893 \] • Keputusan
Karena 27.081 < 1.200893, maka tolak \(H_0\)
• Kesimpulan Dengan taraf nyata 5%, ditemukan bahwa hasil pengujian adalah tolak H0.
# Selisih deviance antar model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 25.88027
Hitung Derajat Bebas
# Chi Square tabel dengan alpha = 0.05
derajat.bebas <- (2 - 1)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi Dengan taraf nyata 5%, ditemukan bahwa hasil pengujian adalah tolak H0.
Model log-linear conditional pada Y memasukkan efek utama dan interaksi dua arah antara X dengan Y dan Y dengan Z, tanpa interaksi antara X dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
# Conditional Association on Y
model_conditional_Y <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_Y)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.28140 0.15831 20.727 < 2e-16 ***
## x.jenis_kelaminPerempuan 0.06454 0.16073 0.402 0.688023
## y.sarapanYa 1.51552 0.17752 8.537 < 2e-16 ***
## z.sekolahSMA Swasta 0.59784 0.16787 3.561 0.000369 ***
## x.jenis_kelaminPerempuan:y.sarapanYa 0.07204 0.18699 0.385 0.700062
## y.sarapanYa:z.sekolahSMA Swasta -0.96556 0.19386 -4.981 6.34e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.3443 on 2 degrees of freedom
## AIC: 61.232
##
## Number of Fisher Scoring iterations: 4
• Hipotesis
\[ H_0 : \lambda_{ik}^{XZ} = 0 \quad \text{(Tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))} \\ H_1 : \lambda_{ik}^{XZ} \ne 0 \quad \text{(Ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))} \]
• Tingkat Signifikansi
\[ \alpha = 5\% \]
• Statistik Uji
\[ \Delta\text{Deviance} = \text{Deviance model conditional on } Y - \text{Deviance model homogenous} \]
\[ = 0.1434172 - 3.84159 = -3.6981728 \]
\[ db = \text{df model conditional on } Y - \text{df model homogenous} \\ = 2 - 1 = 1 \] • Daerah Penolakan
Tolak \(H_0\) jika \(\Delta\text{Deviance} > \chi^2_{0.05, 2} = 3.841\)
• Keputusan
\[ \text{Karena } 0.1434172 < 3.841, \text{ maka terima } H_0 \] • Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance
Deviance.model
## [1] 0.1434172
Hitung Derajat Bebas
derajat.bebas <- (2 - 1)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi
Dengan taraf nyata 5%, didapatkan bahwa hasilnya terima H0
Model log-linear conditional pada Z memasukkan efek utama dan interaksi dua arah antara X dengan Z dan Y dengan Z, tanpa interaksi antara X dengan Y maupun interaksi tiga arah. \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# Conditional Association on Z
model_conditional_Z <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*z.sekolah + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_Z)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * z.sekolah + y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.26540 0.14722 22.180
## x.jenis_kelaminPerempuan 0.09531 0.11282 0.845
## y.sarapanYa 1.55335 0.14842 10.466
## z.sekolahSMA Swasta 0.57252 0.18920 3.026
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.04779 0.16458 0.290
## y.sarapanYa:z.sekolahSMA Swasta -0.96556 0.19386 -4.981
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.39820
## y.sarapanYa < 2e-16 ***
## z.sekolahSMA Swasta 0.00248 **
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.77152
## y.sarapanYa:z.sekolahSMA Swasta 6.34e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.4083 on 2 degrees of freedom
## AIC: 61.296
##
## Number of Fisher Scoring iterations: 4
• Hipotesis
\[ H_0 : \lambda_{ij}^{XY} = 0 \quad \text{(Tidak ada interaksi antara jenis kelamin (X) dan perlakuan intercouse (Y))} \\ H_1 : \lambda_{ij}^{XY} \ne 0 \quad \text{(Ada interaksi antara jenis kelamin (X) dan perlakuan intercouse (Y))} \]
• Tingkat Signifikansi
\[ \alpha = 5\% \]
• Statistik Uji
\[ \Delta\text{Deviance} = \text{Deviance model conditional on } Z - \text{Deviance model homogenous} \]
\[ = 3.841459 - 0.2074333 = 3.6340257 \]
\[ db = \text{df model conditional on } Z - \text{df model homogenous} \\ = 2 - 1 = 1 \] • Daerah Penolakan
Tolak \(H_0\) jika \(\Delta\text{Deviance} > \chi^2_{0.05, 1} = 3.841\)
• Keputusan
\[ \text{Karena } 8.481991 > 3.841, \text{ maka tolak } H_0 \] • Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance
Deviance.model
## [1] 0.2074333
Hitung Derajat Bebas
derajat.bebas <- (2 - 1)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi
karena nilai Deviance model > chi tabel, maka dinyatakan terima H0
Model log linier dengan berbagai kombinasi parameter:
ModelSaturated |
Parameter\[\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk}\] |
Deviance | Jumlah Parameter | df | AIC | ==========+==================+=====+========+ 3.841459 | 8 | 0 | 86.969 | ||||
| Homogenous | \[\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk}\] | 0.1434172 | 7 | 1 | 61.232 | | ||||
| Conditional on X | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \] | 3.841459 | 6 | 2 | 61.296 | | | | | | | | | | ||||
| Conditional on Y | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \] | 3.26540 | 6 | 2 | 86.969 | | | | | | | | | | ||||
| Conditional on Z | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \] | 0.57252 | 6 | 2 | 65.38 | |
InteraksiXYZ |
PengujianSaturated vs Homogenous |
\[\\Delta\] deviance | \[\\Delta\] df | Chi-square Tabel | Keputusan | Keterangan | ======================+================+==================+================+=====================+ -5.107026e-15 | 2 | 1.200893 | Terima \[H_0\] | tidak ada interaksi | ||
| YZ | Conditional on X vs Homogenous | 3.841459 | 1 | 0.2074333 | Tolak \[H_0\] | ada interaksi | | ||
| XZ | Conditional on Y vs Homogenous | 3.841459 | 1 | 0.2074333 | Terima | tidak ada interaksi | | \[H_0\] | | |
| XY | Conditional on Z vs Homogenous | 3.841459 | 1 | 0.2074333 | Tolak \[H_0\] | ada interaksi | | ||
Dari hasil di atas diketahui bahwa asosiasi yang nyata hanya terdapat interaksi antara Intercouse dan Ras serta jenis kelamin dan intercouse. Sehingga, model terbaik adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{YZ} + \lambda_{ij}^{XY} \]
Model terbaik dipilih berdasarkan pengujian interaksi yang signifkan, yaitu model conditional on Y yaitu model yang hanya terdapat interaksi dua arah antara intercouse (Y) dan ras (Z) serta jenis kelamin (X) dan intercouse (Y).
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{YZ} + \lambda_{ij}^{XY} \]
# Model Terbaik
bestmodel <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(bestmodel)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.28140 0.15831 20.727 < 2e-16 ***
## x.jenis_kelaminPerempuan 0.06454 0.16073 0.402 0.688023
## y.sarapanYa 1.51552 0.17752 8.537 < 2e-16 ***
## z.sekolahSMA Swasta 0.59784 0.16787 3.561 0.000369 ***
## x.jenis_kelaminPerempuan:y.sarapanYa 0.07204 0.18699 0.385 0.700062
## y.sarapanYa:z.sekolahSMA Swasta -0.96556 0.19386 -4.981 6.34e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.3443 on 2 degrees of freedom
## AIC: 61.232
##
## Number of Fisher Scoring iterations: 4
# Interpretasi koefisien model terbaik
data.frame(
koef = bestmodel$coefficients,
exp_koef = exp(bestmodel$coefficients)
)
\[ \exp(\lambda^{X}_{perempuan) = \exp(0.064) = 1.066\Rightarrow \text{nilai odds} \] Tanpa memperhatikan ras dan intercouse, peluang seseorang berjenis kelamin perempuan adalah 1.066 kali dibandingkan laki-laki.
\[ \exp(\lambda^{Y}_{sarapan}) = \exp(0.064) = 1.07 \Rightarrow \text{nilai odds} \] Tanpa memperhatikan jenis kelamin dan sarapan \[ \exp(\lambda^{Z}_{tidak sarapan}) = \exp(0.064) = 3.281 \Rightarrow \text{nilai odds} \] Tanpa memperhatikan jenis kelamin dan sekolah,
\[ \exp(\lambda^{XY}_{perempuan,sarapan}) = \exp(0.570) = 1.768 \Rightarrow \text{nilai odds} \] Tanpa memperhatikan perempuan, odds seseorang melakukan sekolah(dibandingkan tidak) jika dia laki - laki adalah 1.768 dibandingkan odds yang sama dibandingkan dia perempuan.
\[ \exp(\lambda^{YZ}_{sarapan,swasta}) = \exp(1.818) = 0.597 \Rightarrow \text{nilai odds ratio} \] Tanpa memperhatikan jenis kelamin, odds seseorang jika bersekolah swasta (dibandingkan sekolah negeri) jika dia adalah 0.597 dibandingkan odds yang sama jika dia belum melakukan intercouse.
# Fitted values dari model terbaik
data.frame(
sekolah = z.sekolah,
jenis_kelamin = x.jenis_kelamin,
int = y.sarapan,
counts = counts,
fitted = bestmodel$fitted.values
)
Diketahui data mengenai hubungan metode pengobatan dan penyembuhan penyakit kanker
Diberikan data:
| Terkena Flu | Tidak Terkena Flu | Total | |
|---|---|---|---|
| Sudah Vaksin | 2 | 18 | 20 |
| Belum Vaksin | 5 | 10 | 15 |
| Total | 7 | 28 | 35 |
Tentukan Peluang bersama, peluang marginal, peluang bersyarat serta ukuran asosiasinya?
# Data: baris = Vaksinasi, kolom = Flu
data <- matrix(c(2,18,5,10), nrow = 2, byrow = TRUE)
colnames(data) <- c("Terkena_Flu", "Tidak_Terkena_Flu")
rownames(data) <- c("Sudah_Vaksin", "Belum_Vaksin")
# Total
n <- sum(data)
# Peluang Bersama
p_bersama <- data / n
# Peluang Marginal
p_marginal_baris <- rowSums(data) / n
p_marginal_kolom <- colSums(data) / n
# Peluang Bersyarat (dengan syarat baris - status vaksinasi)
p_bersyarat <- data / rowSums(data)
# Output
list(
Peluang_Bersama = p_bersama,
Peluang_Marginal_Baris = p_marginal_baris,
Peluang_Marginal_Kolom = p_marginal_kolom,
Peluang_Bersyarat = p_bersyarat
)
## $Peluang_Bersama
## Terkena_Flu Tidak_Terkena_Flu
## Sudah_Vaksin 0.05714286 0.5142857
## Belum_Vaksin 0.14285714 0.2857143
##
## $Peluang_Marginal_Baris
## Sudah_Vaksin Belum_Vaksin
## 0.5714286 0.4285714
##
## $Peluang_Marginal_Kolom
## Terkena_Flu Tidak_Terkena_Flu
## 0.2 0.8
##
## $Peluang_Bersyarat
## Terkena_Flu Tidak_Terkena_Flu
## Sudah_Vaksin 0.1000000 0.9000000
## Belum_Vaksin 0.3333333 0.6666667
Interpretasi: Orang yang sudah vaksin memiliki kemungkinan sekitar 70% lebih kecil terkena flu dibandingkan yang belum vaksin.
#Ukuran Asosiasi
# Data
a <- 2
b <- 18
c <- 5
d <- 10
# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
# Odds Ratio
OR <- (a * d) / (b * c)
#Hasil
list(Risk_Difference = RD, Relative_Risk = RR, Odds_Ratio = OR)
## $Risk_Difference
## [1] -0.2333333
##
## $Relative_Risk
## [1] 0.3
##
## $Odds_Ratio
## [1] 0.2222222
interpretasi: - RD = -0.2333333 → Terdapat perbedaan risiko sebesar 23.33% lebih rendah terkena flu pada individu yang sudah vaksin dibandingkan dengan yang belum vaksin.
RR = 0.3 → Individu yang sudah vaksin memiliki kemungkinan hanya 0.3 kali (atau 70% lebih kecil) untuk terkena flu dibandingkan individu yang belum vaksin.
OR = 0.2222222 → Peluang terkena flu pada individu yang sudah vaksin adalah sekitar 0.22 kali (atau 77.78% lebih kecil) dibandingkan dengan yang belum vaksin.
\[ \begin{array}{|c|c|c|c|} \hline \textbf{Kategori Sekolah} & \textbf{Jenis Kelamin} & \textbf{Sarapan (Ya)} & \textbf{Tidak Sarapan (No)} \\ \hline \text{SMA Negeri} & \text{Laki-laki} & 120 & 30 \\ \text{SMA Negeri} & \text{Perempuan} & 140 & 25 \\ \text{SMA Swasta} & \text{Laki-laki} & 85 & 45 \\ \text{SMA Swasta} & \text{Perempuan} & 95 & 55 \\ \hline \end{array} \] Tentukan model terbaiknya menggunakan model apa dan intepretasikan hasil koefisiennya!
## Input data sarapan
sekolah <- factor(rep(c("SMA Negeri", "SMA Swasta"), each = 4))
jenis_kelamin <- factor(rep(c("Laki-laki", "Perempuan"), each = 2, times = 2))
sarapan <- factor(rep(c("Ya", "Tidak"), times = 4))
frekuensi <- c(120, 30, 140, 25, 85, 45, 95, 55)
# Membentuk data frame
data_sarapan <- data.frame(
Sekolah = z.sekolah,
Jenis_Kelamin = x.jenis_kelamin,
Sarapan = y.sarapan,
Frekuensi = frekuensi
)
# Menampilkan data
print(data_sarapan)
## Sekolah Jenis_Kelamin Sarapan Frekuensi
## 1 SMA Negeri Laki-laki Ya 120
## 2 SMA Negeri Laki-laki Tidak 30
## 3 SMA Negeri Perempuan Ya 140
## 4 SMA Negeri Perempuan Tidak 25
## 5 SMA Swasta Laki-laki Ya 85
## 6 SMA Swasta Laki-laki Tidak 45
## 7 SMA Swasta Perempuan Ya 95
## 8 SMA Swasta Perempuan Tidak 55
# Model saturated
model_saturated <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + x.jenis_kelamin*z.sekolah + y.sarapan*z.sekolah +
x.jenis_kelamin*y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + x.jenis_kelamin * z.sekolah +
## y.sarapan * z.sekolah + x.jenis_kelamin * y.sarapan * z.sekolah,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 3.4012 0.1826
## x.jenis_kelaminPerempuan -0.1823 0.2708
## y.sarapanYa 1.3863 0.2041
## z.sekolahSMA Swasta 0.4055 0.2357
## x.jenis_kelaminPerempuan:y.sarapanYa 0.3365 0.2980
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.3830 0.3372
## y.sarapanYa:z.sekolahSMA Swasta -0.7503 0.2751
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta -0.4259 0.3892
## z value Pr(>|z|)
## (Intercept) 18.629 < 2e-16 ***
## x.jenis_kelaminPerempuan -0.673 0.50078
## y.sarapanYa 6.791 1.11e-11 ***
## z.sekolahSMA Swasta 1.720 0.08539 .
## x.jenis_kelaminPerempuan:y.sarapanYa 1.129 0.25887
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 1.136 0.25611
## y.sarapanYa:z.sekolahSMA Swasta -2.728 0.00637 **
## x.jenis_kelaminPerempuan:y.sarapanYa:z.sekolahSMA Swasta -1.094 0.27385
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.7371e+02 on 7 degrees of freedom
## Residual deviance: -5.1070e-15 on 0 degrees of freedom
## AIC: 63.888
##
## Number of Fisher Scoring iterations: 3
# Homogenous Model
model_homogenous <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + x.jenis_kelamin*z.sekolah+ y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + x.jenis_kelamin * z.sekolah +
## y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.30240 0.16675 19.804
## x.jenis_kelaminPerempuan 0.02344 0.19394 0.121
## y.sarapanYa 1.50834 0.17757 8.494
## z.sekolahSMA Swasta 0.56509 0.18868 2.995
## x.jenis_kelaminPerempuan:y.sarapanYa 0.08710 0.19121 0.456
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.06373 0.16830 0.379
## y.sarapanYa:z.sekolahSMA Swasta -0.96695 0.19393 -4.986
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.90381
## y.sarapanYa < 2e-16 ***
## z.sekolahSMA Swasta 0.00274 **
## x.jenis_kelaminPerempuan:y.sarapanYa 0.64873
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.70495
## y.sarapanYa:z.sekolahSMA Swasta 6.17e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.2009 on 1 degrees of freedom
## AIC: 63.089
##
## Number of Fisher Scoring iterations: 3
# Conditional Association on X
model_conditional_X <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan+ x.jenis_kelamin*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_X)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + x.jenis_kelamin * z.sekolah,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.69333 0.12817 28.815
## x.jenis_kelaminPerempuan 0.04207 0.17837 0.236
## y.sarapanYa 1.00552 0.13495 7.451
## z.sekolahSMA Swasta -0.14310 0.11983 -1.194
## x.jenis_kelaminPerempuan:y.sarapanYa 0.07204 0.18699 0.385
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.04779 0.16458 0.290
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.814
## y.sarapanYa 9.26e-14 ***
## z.sekolahSMA Swasta 0.232
## x.jenis_kelaminPerempuan:y.sarapanYa 0.700
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.772
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.714 on 7 degrees of freedom
## Residual deviance: 27.081 on 2 degrees of freedom
## AIC: 86.969
##
## Number of Fisher Scoring iterations: 4
# Conditional Association on Y
model_conditional_Y <- glm(counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
x.jenis_kelamin*y.sarapan + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_Y)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * y.sarapan + y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.28140 0.15831 20.727 < 2e-16 ***
## x.jenis_kelaminPerempuan 0.06454 0.16073 0.402 0.688023
## y.sarapanYa 1.51552 0.17752 8.537 < 2e-16 ***
## z.sekolahSMA Swasta 0.59784 0.16787 3.561 0.000369 ***
## x.jenis_kelaminPerempuan:y.sarapanYa 0.07204 0.18699 0.385 0.700062
## y.sarapanYa:z.sekolahSMA Swasta -0.96556 0.19386 -4.981 6.34e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.3443 on 2 degrees of freedom
## AIC: 61.232
##
## Number of Fisher Scoring iterations: 4
# Conditional Association on Z
model_conditional_Z <- glm(counts ~ x.jenis_kelamin+ y.sarapan + z.sekolah +
x.jenis_kelamin*z.sekolah + y.sarapan*z.sekolah,
family = poisson(link = "log"))
summary(model_conditional_Z)
##
## Call:
## glm(formula = counts ~ x.jenis_kelamin + y.sarapan + z.sekolah +
## x.jenis_kelamin * z.sekolah + y.sarapan * z.sekolah, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.26540 0.14722 22.180
## x.jenis_kelaminPerempuan 0.09531 0.11282 0.845
## y.sarapanYa 1.55335 0.14842 10.466
## z.sekolahSMA Swasta 0.57252 0.18920 3.026
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.04779 0.16458 0.290
## y.sarapanYa:z.sekolahSMA Swasta -0.96556 0.19386 -4.981
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## x.jenis_kelaminPerempuan 0.39820
## y.sarapanYa < 2e-16 ***
## z.sekolahSMA Swasta 0.00248 **
## x.jenis_kelaminPerempuan:z.sekolahSMA Swasta 0.77152
## y.sarapanYa:z.sekolahSMA Swasta 6.34e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 173.7145 on 7 degrees of freedom
## Residual deviance: 1.4083 on 2 degrees of freedom
## AIC: 61.296
##
## Number of Fisher Scoring iterations: 4
Dari hasil di atas diketahui bahwa asosiasi yang nyata hanya terdapat interaksi antara Intercouse dan Ras serta jenis kelamin dan intercouse. Sehingga, model terbaik adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{YZ} + \lambda_{ij}^{XY} \]
# Interpretasi koefisien model terbaik
data.frame(
koef = bestmodel$coefficients,
exp_koef = exp(bestmodel$coefficients)
)