Sebuah survei dilakukan terhadap 200 orang untuk mengetahui hubungan antara kebiasaan membaca buku dan kebiasaan menonton film. Hasil survei dirangkum dalam tabel kontingensi berikut:
Menonton Film | Tidak Menonton Film | Total | |
---|---|---|---|
Membaca Buku | 80 | 20 | 100 |
Tidak Membaca Buku | 40 | 60 | 100 |
Total | 120 | 80 | 200 |
Notasi:
Peluang bersama adalah probabilitas bahwa dua peristiwa terjadi bersamaan, dihitung sebagai rasio frekuensi kejadian terhadap total sampel. Peluang bersama dihitung dengan rumus: \[ P(A \cap B) = \frac{n(A \cap B)}{n} \] Dimana: - \(n(A \cap B)\) adalah jumlah kejadian tertentu dalam tabel - \(n\) adalah total observasi (200)
# Data jumlah observasi
total <- 200
# Peluang bersama
P_A_B <- 80 / total # Membaca buku dan menonton film
P_A_notB <- 20 / total # Membaca buku dan tidak menonton film
P_notA_B <- 40 / total # Tidak membaca buku dan menonton film
P_notA_notB <- 60 / total # Tidak membaca buku dan tidak menonton film
# Menampilkan hasil
P_A_B; P_A_notB; P_notA_B; P_notA_notB
## [1] 0.4
## [1] 0.1
## [1] 0.2
## [1] 0.3
\(P(\text{Membaca} \cap \text{Menonton}) = \frac{a}{n} = \frac{80}{200} = 0.4\)
\(P(\text{Membaca} \cap \text{Tidak Menonton}) = \frac{b}{n} = \frac{20}{200} = 0.1\)
\(P(\text{Tidak Membaca} \cap \text{Menonton}) = \frac{c}{n} = \frac{40}{200} = 0.2\)
\(P(\text{Tidak Membaca} \cap \text{Tidak Menonton}) = \frac{d}{n} = \frac{60}{200} = 0.3\)
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
joint_data <- matrix(c(0.4, 0.1, 0.2, 0.3), nrow = 2, byrow = TRUE)
rownames(joint_data) <- c("Membaca Buku", "Tidak Membaca Buku")
colnames(joint_data) <- c("Menonton Film", "Tidak Menonton Film")
kable(joint_data,caption = "Tabel Peluang Bersama")
Menonton Film | Tidak Menonton Film | |
---|---|---|
Membaca Buku | 0.4 | 0.1 |
Tidak Membaca Buku | 0.2 | 0.3 |
Peluang marjinal adalah probabilitas suatu peristiwa terjadi tanpa mempedulikan peristiwa lain, dihitung dari total baris atau kolom. Peluang marginal dihitung dengan rumus: \[ P(A) = \frac{n(A)}{n} \] \[ P(B) = \frac{n(B)}{n} \] Dimana: - \(n(A)\) dan \(n(B)\) adalah jumlah total dari masing-masing kategori.
# Peluang marginal
P_A <- (80+20) / total # Peluang membaca buku
P_notA <- (40+60) / total # Peluang tidak membaca buku
P_B <- (80+40) / total # Peluang menonton film
P_notB <- (20+60) / total # Peluang tidak menonton film
# Menampilkan hasil
P_A; P_notA; P_B; P_notB
## [1] 0.5
## [1] 0.5
## [1] 0.6
## [1] 0.4
\(P(\text{Membaca}) = \frac{a + b}{n} = \frac{80 + 20}{200} = 0.5\)
\(P(\text{Tidak Membaca}) = \frac{c + d}{n} = \frac{40 + 60}{200} = 0.5\)
\(P(\text{Menonton}) = \frac{a + c}{n} = \frac{80 + 40}{200} = 0.6\)
\(P(\text{Tidak Menonton}) = \frac{b + d}{n} = \frac{20 + 60}{200} = 0.4\)
Peluang bersyarat adalah probabilitas suatu peristiwa terjadi dengan syarat peristiwa lain telah terjadi. Peluang bersyarat dihitung dengan rumus: \[ P(A|B) = \frac{P(A \cap B)}{P(B)} \] \[ P(B|A) = \frac{P(A \cap B)}{P(A)} \]
# Peluang bersyarat
P_B_given_A <- P_A_B / P_A
P_notB_given_A <- P_A_notB / P_A
P_B_given_notA <- P_notA_B / P_notA
P_notB_given_notA <- P_notA_notB / P_notA
P_A_given_B <- P_A_B / P_B
P_notA_given_B <- P_notA_B / P_B
P_A_given_notB <- P_A_notB / P_notB
P_notA_given_notB <- P_notA_notB / P_notB
# Tampilkan hasil
P_B_given_A # P(Menonton | Membaca)
## [1] 0.8
P_notB_given_A # P(Tidak Menonton | Membaca)
## [1] 0.2
P_B_given_notA # P(Menonton | Tidak Membaca)
## [1] 0.4
P_notB_given_notA # P(Tidak Menonton | Tidak Membaca)
## [1] 0.6
P_A_given_B # P(Membaca | Menonton)
## [1] 0.6666667
P_notA_given_B # P(Tidak Membaca | Menonton)
## [1] 0.3333333
P_A_given_notB # P(Membaca | Tidak Menonton)
## [1] 0.25
P_notA_given_notB # P(Tidak Membaca | Tidak Menonton)
## [1] 0.75
\(P(\text{Menonton} | \text{Membaca}) = \frac{P(\text{Membaca} \cap \text{Menonton})}{P(\text{Membaca})} = \frac{0.4}{0.5} = 0.8\)
\(P(\text{Tidak Menonton} | \text{Membaca}) = \frac{P(\text{Membaca} \cap \text{Tidak Menonton})}{P(\text{Membaca})} = \frac{0.1}{0.5} = 0.2\)
\(P(\text{Menonton} | \text{Tidak Membaca}) = \frac{P(\text{Tidak Membaca} \cap \text{Menonton})}{P(\text{Tidak Membaca})} = \frac{0.2}{0.5} = 0.4\)
\(P(\text{Tidak Menonton} | \text{Tidak Membaca}) = \frac{P(\text{Tidak Membaca} \cap \text{Tidak Menonton})}{P(\text{Tidak Membaca})} = \frac{0.3}{0.5} = 0.6\)
\(P(\text{Membaca} | \text{Menonton}) = \frac{P(\text{Membaca} \cap \text{Menonton})}{P(\text{Menonton})} = \frac{0.4}{0.6} = 0.6667\)
\(P(\text{Tidak Membaca} | \text{Menonton}) = \frac{P(\text{Tidak Membaca} \cap \text{Menonton})}{P(\text{Menonton})} = \frac{0.2}{0.6} = 0.3333\)
\(P(\text{Membaca} | \text{Tidak Menonton}) = \frac{P(\text{Membaca} \cap \text{Tidak Menonton})}{P(\text{Tidak Menonton})} = \frac{0.1}{0.4} = 0.25\)
\(P(\text{Tidak Membaca} | \text{Tidak Menonton}) = \frac{P(\text{Tidak Membaca} \cap \text{Tidak Menonton})}{P(\text{Tidak Menonton})} = \frac{0.3}{0.4} = 0.75\)
Ada korelasi yang kuat antara kebiasaan menonton film dan membaca
buku. Individu yang membaca buku cenderung juga lebih sering menonton
film, dan individu yang tidak membaca buku cenderung lebih jarang
melakukannya.
Sebaliknya juga berlaku: jika seseorang suka menonton film,
kemungkinan besar juga suka membaca buku. Namun, jika seseorang tidak
menonton film, kemungkinan besar juga tidak akan membaca buku.
Jadi, kebiasaan membaca dan menonton itu terkait. Artinya, minat
terhadap satu aktivitas mungkin juga menunjukkan minat terhadap
aktivitas lain. Ini menunjukkan adanya pola preferensi atau gaya hidup
yang saling terkait antara kedua aktivitas tersebut.
Beda peluang dihitung dengan: \[ RD = P(A|B) - P(A|\neg B) \]
Risk difference mengukur perbedaan probabilitas kejadian (menonton film) antara dua kelompok (membaca vs. tidak membaca).
RD <- P_B_given_A-P_B_given_notA
RD
## [1] 0.4
\(RD = P(\text{Menonton} | \text{Membaca}) - P(\text{Menonton} | \text{Tidak Membaca})\)
\(RD = 0.8 - 0.4 = 0.4\)
Individu yang membaca buku memiliki probabilitas 40% lebih tinggi untuk menonton film dibandingkan mereka yang tidak membaca buku.
Relative risk mengukur rasio probabilitas kejadian antara dua kelompok. Resiko relatif dihitung dengan: \[ RR = \frac{P(A|B)}{P(A|\neg B)} \]
RR <- P_B_given_A/P_B_given_notA
RR
## [1] 2
\(RR = \frac{P(\text{Menonton} | \text{Membaca})}{P(\text{Menonton} | \text{Tidak Membaca})}\)
\(RR = \frac{0.8}{0.4} = 2\)
Individu yang membaca buku memiliki risiko (probabilitas) 2 kali lebih besar untuk menonton film dibandingkan mereka yang tidak membaca buku.
Odds ratio mengukur rasio odds kejadian antara dua kelompok. Odds didefinisikan sebagai rasio probabilitas kejadian terhadap probabilitas tidak terjadi. Rasio odds dihitung dengan: \[ OR = \frac{(P(A|B) / P(\neg A|B))}{(P(A|\neg B) / P(\neg A|\neg B))} \]
OR <- (P_A_given_B / P_notA_given_B) / ((P_A_notB / P_notB) / (P_notA_notB / P_notB))
OR
## [1] 6
Odds individu yang membaca buku untuk menonton film adalah 6 kali lebih besar dibandingkan odds individu yang tidak membaca buku.
Ada indikasi kuat bahwa kebiasaan membaca buku berasosiasi positif dengan kebiasaan menonton film.
Risk Difference (RD) nunjukin bahwa orang yang membaca buku punya selisih probabilitas lebih tinggi untuk menonton film dibanding yang nggak baca — jadi ada gap signifikan antar dua kelompok.
Relative Risk (RR) bilang bahwa pembaca buku dua kali lebih mungkin buat menonton film dibanding non-pembaca.
Odds Ratio (OR) memperkuat itu semua dengan nunjukin bahwa peluang relatif (odds) orang yang membaca untuk menonton film itu enam kali lipat dibanding yang nggak membaca.
Bisa disimpulin bahwa membaca buku bukan cuma aktivitas terpisah, tapi mungkin bagian dari gaya hidup yang aktif mencari hiburan/informasi dari berbagai sumber—termasuk nonton film. Jadi, promosi kebiasaan membaca bisa secara nggak langsung ngedorong ketertarikan pada aktivitas budaya lainnya.
data <- data.frame(
Nyeri_Dada = rep(c("Typical Angina", "Asymptomatic"), each = 2),
Gender = rep(c("Perempuan", "Laki-Laki"), times = 2),
Terkena_Penyakit_Jantung = c(21, 11, 14, 21),
Tidak_Terkena_Penyakit_Jantung = c(17, 14, 21, 20)
)
kable(data, caption = "Data Input")
Nyeri_Dada | Gender | Terkena_Penyakit_Jantung | Tidak_Terkena_Penyakit_Jantung |
---|---|---|---|
Typical Angina | Perempuan | 21 | 17 |
Typical Angina | Laki-Laki | 11 | 14 |
Asymptomatic | Perempuan | 14 | 21 |
Asymptomatic | Laki-Laki | 21 | 20 |
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
typical_angina <- data %>% filter(Nyeri_Dada == "Typical Angina") %>% select(-Nyeri_Dada);typical_angina
## Gender Terkena_Penyakit_Jantung Tidak_Terkena_Penyakit_Jantung
## 1 Perempuan 21 17
## 2 Laki-Laki 11 14
Nyeri Dada | Gender | Terkena Penyakit Jantung | Tidak Terkena Penyakit Jantung |
---|---|---|---|
Typical Angina | Perempuan | 21 | 17 |
Typical Angina | Laki-Laki | 11 | 14 |
asymptomatic <- data %>% filter(Nyeri_Dada == "Asymptomatic") %>% select(-Nyeri_Dada);asymptomatic
## Gender Terkena_Penyakit_Jantung Tidak_Terkena_Penyakit_Jantung
## 1 Perempuan 14 21
## 2 Laki-Laki 21 20
Nyeri Dada | Gender | Terkena Penyakit Jantung | Tidak Terkena Penyakit Jantung |
---|---|---|---|
Asymptomatic | Perempuan | 14 | 21 |
Asymptomatic | Laki-Laki | 21 | 20 |
marginal2 <- data %>%
group_by(Gender) %>%
summarise(across(where(is.numeric), sum), .groups = "drop");marginal2
## # A tibble: 2 × 3
## Gender Terkena_Penyakit_Jantung Tidak_Terkena_Penyakit_Jantung
## <chr> <dbl> <dbl>
## 1 Laki-Laki 32 34
## 2 Perempuan 35 38
Gender | Terkena Penyakit Jantung | Tidak Terkena Penyakit Jantung | Total |
---|---|---|---|
Perempuan | 35 | 38 | 73 |
Laki-Laki | 32 | 34 | 66 |
marginal1 <- data %>%
group_by(Nyeri_Dada) %>%
summarise(across(where(is.numeric), sum), .groups = "drop");marginal1
## # A tibble: 2 × 3
## Nyeri_Dada Terkena_Penyakit_Jantung Tidak_Terkena_Penyakit_Jantung
## <chr> <dbl> <dbl>
## 1 Asymptomatic 35 41
## 2 Typical Angina 32 31
Nyeri Dada | Terkena Penyakit Jantung | Tidak Terkena Penyakit Jantung | Total |
---|---|---|---|
Asymtomatic | 35 | 41 | 73 |
Typical Angina | 32 | 31 | 66 |
Peluang bersama adalah probabilitas tiga peristiwa terjadi bersamaan, dihitung sebagai:
\(P(A \cap B \cap C) =
\frac{\text{Frekuensi}(A \cap B \cap C)}{n}\)
table_array <- array(c(21, 17, 11, 14, 14, 21, 21, 20),
dim = c(2, 2, 2),
dimnames = list(
Nyeri_Dada = c("Typical Angina", "Asymptomatic"),
Gender = c("Perempuan", "Laki-Laki"),
Penyakit_Jantung = c("Terkena", "Tidak Terkena")
))
joint_prob <- table_array / sum(table_array)
kable(joint_prob[,,1], caption = "Peluang Bersama: Terkena Penyakit Jantung")
Perempuan | Laki-Laki | |
---|---|---|
Typical Angina | 0.1510791 | 0.0791367 |
Asymptomatic | 0.1223022 | 0.1007194 |
kable(joint_prob[,,2], caption = "Peluang Bersama: Tidak Terkena Penyakit Jantung")
Perempuan | Laki-Laki | |
---|---|---|
Typical Angina | 0.1007194 | 0.1510791 |
Asymptomatic | 0.1510791 | 0.1438849 |
Peluang marjinal adalah probabilitas suatu peristiwa tanpa mempedulikan peristiwa lain. Rumus: \(P(A) = \frac{\text{Total frekuensi } A}{n}\)
marginal_nyeri <- margin.table(table_array, 1) / sum(table_array)
marginal_gender <- margin.table(table_array, 2) / sum(table_array)
marginal_jantung <- margin.table(table_array, 3) / sum(table_array)
cat("Peluang Marjinal:\n")
## Peluang Marjinal:
cat("P(Typical Angina) =", marginal_nyeri[1], "\n")
## P(Typical Angina) = 0.4820144
cat("P(Asymptomatic) =", marginal_nyeri[2], "\n")
## P(Asymptomatic) = 0.5179856
cat("P(Perempuan) =", marginal_gender[1], "\n")
## P(Perempuan) = 0.5251799
cat("P(Laki-Laki) =", marginal_gender[2], "\n")
## P(Laki-Laki) = 0.4748201
cat("P(Terkena) =", marginal_jantung[1], "\n")
## P(Terkena) = 0.4532374
cat("P(Tidak Terkena) =", marginal_jantung[2], "\n")
## P(Tidak Terkena) = 0.5467626
Peluang bersyarat adalah probabilitas suatu peristiwa dengan syarat peristiwa lain telah terjadi. Misalnya, kita hitung \(P(\text{Terkena} | \text{Nyeri Dada}, \text{Gender})\)
Rumus: \(P(A|B,C) = \frac{P(A \cap B \cap C)}{P(B \cap C)}\)
Perhitungan (contoh untuk \(P(\text{Terkena} | \text{Typical Angina}, \text{Perempuan}) )\): \(P(\text{Typical Angina} \cap \text{Perempuan}) = \frac{21 + 17}{139} = \frac{38}{139} \approx 0.2734\) \(P(\text{Terkena} | \text{Typical Angina}, \text{Perempuan}) = \frac{P(\text{Typical Angina} \cap \text{Perempuan} \cap \text{Terkena})}{P(\text{Typical Angina} \cap \text{Perempuan})} = \frac{0.1511}{0.2734} \approx 0.5526\)
cond_prob <- array(NA, dim = c(2, 2, 2),
dimnames = list(
Nyeri_Dada = c("Typical Angina", "Asymptomatic"),
Gender = c("Perempuan", "Laki-Laki"),
Penyakit_Jantung = c("Terkena", "Tidak Terkena")
))
for (i in 1:2) {
for (j in 1:2) {
denom <- sum(table_array[i,j,])
if (denom > 0) {
cond_prob[i,j,1] <- table_array[i,j,1] / denom
cond_prob[i,j,2] <- table_array[i,j,2] / denom
}
}
}
kable(cond_prob[,,1], caption = "Peluang Bersyarat: P(Terkena | Nyeri Dada, Gender)")
Perempuan | Laki-Laki | |
---|---|---|
Typical Angina | 0.6000000 | 0.3437500 |
Asymptomatic | 0.4473684 | 0.4117647 |
kable(cond_prob[,,2], caption = "Peluang Bersyarat: P(Tidak Terkena | Nyeri Dada, Gender)")
Perempuan | Laki-Laki | |
---|---|---|
Typical Angina | 0.4000000 | 0.6562500 |
Asymptomatic | 0.5526316 | 0.5882353 |
Risk difference mengukur selisih probabilitas kejadian (Terkena Penyakit Jantung) antara dua level Nyeri Dada untuk setiap Gender.
Rumus: \(RD = P(\text{Terkena} | \text{Typical Angina}, \text{Gender}) - P(\text{Terkena} | \text{Asymptomatic}, \text{Gender})\)
Perhitungan:
Untuk Perempuan: \(RD = 0.5526 - 0.4000 = 0.1526\)
Untuk Laki-Laki: \(RD = 0.4400 - 0.5122 = -0.0722\)
rd_perempuan <- cond_prob[1,1,1] - cond_prob[2,1,1]
rd_lakilaki <- cond_prob[1,2,1] - cond_prob[2,2,1]
cat("Risk Difference (Perempuan) =", rd_perempuan, "\n")
## Risk Difference (Perempuan) = 0.1526316
cat("Risk Difference (Laki-Laki) =", rd_lakilaki, "\n")
## Risk Difference (Laki-Laki) = -0.06801471
Interpretasi: Pada Perempuan, Typical Angina meningkatkan probabilitas penyakit jantung sebesar 15.26%.
Pada Laki-Laki, Typical Angina mengurangi probabilitas penyakit jantung sebesar 7.22%.
Relative risk mengukur rasio probabilitas kejadian antara dua level Nyeri Dada untuk setiap Gender.
Rumus: \(RR = \frac{P(\text{Terkena} | \text{Typical Angina}, \text{Gender})}{P(\text{Terkena} | \text{Asymptomatic}, \text{Gender})}\)
Perhitungan: Untuk Perempuan: \(RR = \frac{0.5526}{0.4000} = 1.3815\)
Untuk Laki-Laki: \(RR = \frac{0.4400}{0.5122} \approx 0.8589\)
rr_perempuan <- cond_prob[1,1,1] / cond_prob[2,1,1]
rr_lakilaki <- cond_prob[1,2,1] / cond_prob[2,2,1]
cat("Relative Risk (Perempuan) =", rr_perempuan, "\n")
## Relative Risk (Perempuan) = 1.341176
cat("Relative Risk (Laki-Laki) =", rr_lakilaki, "\n")
## Relative Risk (Laki-Laki) = 0.8348214
Interpretasi:
Pada Perempuan, risiko penyakit jantung 1.38 kali lebih tinggi dengan Typical Angina.
Pada Laki-Laki, risiko penyakit jantung 0.86 kali lebih rendah dengan Typical Angina.
dds ratio mengukur rasio odds kejadian untuk setiap Gender.
Rumus: \(OR = \frac{\text{Odds}(\text{Typical Angina} | \text{Gender})}{\text{Odds}(\text{Asymptomatic} | \text{Gender})} = \frac{a \cdot d}{b \cdot c}\) dengan ( a, b, c, d ) dari tabel 2x2 parsial.
Perhitungan:
Perempuan:
\(\text{Odds}_{\text{Typical Angina}} = \frac{21}{17} \approx 1.2353\)
\(\text{Odds}_{\text{Asymptomatic}} = \frac{14}{21} \approx 0.6667\)
\(OR = \frac{1.2353}{0.6667} \approx 1.8529\)
Laki-Laki:
\(\text{Odds}_{\text{Typical Angina}} = \frac{11}{14} \approx 0.7857\)
\(\text{Odds}_{\text {Asymptomatic}} = \frac{21}{20} = \approx 1.0500\)
\(OR = \frac{0.7857}{1.0500} \approx 0.7483\)
or_perempuan <- (table_array[1,1,1] * table_array[2,1,2]) / (table_array[1,1,2] * table_array[2,1,1])
or_lakilaki <- (table_array[1,2,1] * table_array[2,2,2]) / (table_array[1,2,2] * table_array[2,2,1])
cat("Odds Ratio (Perempuan) =", or_perempuan, "\n")
## Odds Ratio (Perempuan) = 1.852941
cat("Odds Ratio (Laki-Laki) =", or_lakilaki, "\n")
## Odds Ratio (Laki-Laki) = 0.7482993
Interpretasi: Pada Perempuan, odds penyakit jantung 1.85 kali lebih tinggi dengan Typical Angina. Pada Laki-Laki, odds penyakit jantung 0.75 kali lebih rendah dengan Typical Angina.
Independensi bersyarat berarti dua variabel independen pada setiap level variabel ketiga. Misalnya, Nyeri Dada dan Penyakit Jantung independen bersyarat pada Gender jika:
\(P(\text{Nyeri Dada}, \text{Penyakit Jantung} \| \text{Gender}) = P(\text{Nyeri Dada} \| \text{Gender}) \cdot P(\text{Penyakit Jantung} \| \text{Gender})\)
Contoh Perhitungan (untuk Typical Angina, Terkena, pada Perempuan):
\(P(\text{Typical Angina} \cap \text{Terkena} | \text{Perempuan}) = \frac{21}{38} \approx 0.5526\)
\(P(\text{Typical Angina} | \text{Perempuan}) = \frac{38}{73} \approx 0.5205\)
\(P(\text{Terkena} | \text{Perempuan}) = \frac{21 + 14}{73} = \frac{35}{73} \approx 0.4795\)
Produk: \(0.5205 \cdot 0.4795 \approx 0.2496 \neq 0.5526\)
Karena nilai tidak sama, Nyeri Dada dan Penyakit Jantung tidak independen bersyarat pada Perempuan. Hal serupa dapat diuji untuk kombinasi lain.
Menggunakan uji Cochran-Mantel-Haenszel (CMH) untuk menguji independensi bersyarat Nyeri Dada dan Penyakit Jantung pada setiap level Gender.
Hipotesis:
\(H_0\): Nyeri Dada dan Penyakit Jantung independen bersyarat pada Gender.
\(H_1\): Tidak independen.
mantelhaen.test(table_array)
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: table_array
## Mantel-Haenszel X-squared = 0.020553, df = 1, p-value = 0.886
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.4872037 1.8606586
## sample estimates:
## common odds ratio
## 0.9521133
Interpretasi: Karena p-value > 0.05 artinya terima \(H_0\), artinya tidak ada asosiasi antara Nyeri Dada dan Penyakit Jantung setelah mengontrol Gender
Odds ratio bersama (common odds ratio) diestimasi menggunakan pendekatan Mantel-Haenszel, yang menggabungkan odds ratio dari setiap tabel parsial.
Rumus: \(OR_{MH} = \frac{\sum_k \frac{a_k d_k}{n_k}}{\sum_k \frac{b_k c_k}{n_k}}\) dengan \(k\) adalah level Gender, \(n_k\) adalah total pada tabel parsial ke-\(k\).
Perhitungan:
Untuk Perempuan \(( k=1 )): ( \frac{a_1 d_1}{n_1} = \frac{21 \cdot 21}{38} \approx 11.6053 ), ( \frac{b_1 c_1}{n_1} = \frac{17 \cdot 14}{38} \approx 6.2632\)
Untuk Laki-Laki \(( k=2 )): ( \frac{a_2 d_2}{n_2} = \frac{11 \cdot 20}{25} = 8.8 ), ( \frac{b_2 c_2}{n_2} = \frac{14 \cdot 21}{25} = 11.76\)
\(OR_{MH} = \frac{11.6053 + 8.8}{6.2632 + 11.76} = \frac{20.4053}{18.0232} \approx 1.1322\)
num <- sum(c(table_array[1,1,1] * table_array[2,1,2] / sum(table_array[1,1,]),
table_array[1,2,1] * table_array[2,2,2] / sum(table_array[1,2,])))
denom <- sum(c(table_array[1,1,2] * table_array[2,1,1] / sum(table_array[1,1,]),
table_array[1,2,2] * table_array[2,2,1] / sum(table_array[1,2,])))
or_mh <- num / denom
cat("Common Odds Ratio (Mantel-Haenszel) =", or_mh, "\n")
## Common Odds Ratio (Mantel-Haenszel) = 1.218139
Interpretasi: Odds ratio bersama sekitar 1.13 menunjukkan asosiasi lemah antara Nyeri Dada dan Penyakit Jantung setelah mengontrol Gender.
Uji Breslow-Day menguji apakah odds ratio antar tabel parsial (Perempuan dan Laki-Laki) homogen.
Hipotesis:
\(H_0\): Odds ratio homogen antar level Gender.
\(H_1\): Odds ratio tidak homogen.
Analisis tabel kontingensi tiga arah menunjukkan:
Peluang: Peluang bersama, marjinal, dan bersyarat memberikan gambaran distribusi data. Misalnya, probabilitas tertinggi adalah untuk Asymptomatic, Laki-Laki, Tidak Terkena (0.1439).
Ukuran Asosiasi:
Risk difference menunjukkan efek beragam Nyeri Dada pada Penyakit Jantung antar Gender.
Relative risk dan odds ratio menunjukkan asosiasi yang berbeda antara Perempuan dan Laki-Laki.
Inferensi:
Independensi bersyarat tidak terpenuhi, menunjukkan adanya asosiasi.
Uji CMH akan menentukan signifikansi asosiasi setelah mengontrol Gender.
Odds ratio bersama (1.13) menunjukkan asosiasi lemah.
Generalized Linear Model (GLM) adalah kerangka statistik yang menggeneralisasi model regresi linear untuk menangani respons yang tidak berdistribusi normal, seperti data kategorikal, count, atau proporsi. GLM terdiri dari tiga komponen utama:
Komponen Acak: Distribusi respons dari keluarga eksponensial (misalnya, binomial, Poisson).
Komponen Sistematik: Kombinasi linear dari prediktor \(( \eta = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p )\).
Fungsi Link: Fungsi yang menghubungkan nilai harapan respons \(( \mu )\) dengan komponen sistematik \(( g(\mu) = \eta )\).
GLM sangat relevan untuk data kategorikal, seperti dalam regresi logistik untuk respons biner. Inferensi GLM melibatkan estimasi parameter \(( \beta )\), uji signifikansi koefisien, dan evaluasi kecocokan model (goodness-of-fit).
Dalam bab ini, kita akan:
Menjelaskan konsep GLM dan komponennya.
Memberikan contoh kasus dengan data fiktif, menggunakan regresi logistik.
Melakukan inferensi GLM, termasuk estimasi parameter, uji Wald, uji likelihood ratio, dan uji goodness-of-fit (deviance dan Hosmer-Lemeshow).
Konsep Generalized Linear Model
Respons ( Y ) diasumsikan mengikuti distribusi dari keluarga eksponensial, yang memiliki bentuk densitas:
\(f(y; \theta, \phi) = \exp\left( \frac{y \theta - b(\theta)}{a(\phi)} + c(y, \phi) \right)\)
\(\theta\): Parameter lokasi (natural parameter).
\(\phi\): Parameter skala (dispersion parameter).
\(b(\theta)\): Fungsi yang menentukan distribusi.
Contoh: Untuk respons biner, \(Y \sim \text{Binomial}(n, \pi)\), dengan \(\pi\) sebagai probabilitas sukses.
Prediktor \(x_1, x_2, \ldots, x_p\) membentuk kombinasi linear:
\(\eta = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p\)
Fungsi link \(g(\cdot)\) menghubungkan nilai harapan respons \(\mu = E(Y)\) dengan \(\eta\):
\(g(\mu) = \eta\)
Untuk regresi logistik (respons biner):
\(\mu = \pi\) (probabilitas sukses).
Fungsi link logit: \(g(\pi) = \log\left( \frac{\pi}{1-\pi} \right) = \eta\).
Invers link: \(\pi = \frac{\exp(\eta)}{1 + \exp(\eta)}\).
Parameter \(\beta\) diestimasi menggunakan Maximum Likelihood Estimation (MLE), dengan fungsi likelihood:
\(L(\beta) = \prod_{i=1}^n f(y_i; \theta_i, \phi)\)
Log-likelihood dioptimalkan secara numerik (misalnya, dengan metode Newton-Raphson).
Inferensi meliputi:
Uji Wald: Menguji signifikansi individu koefisien \(( H_0: \beta_j = 0 )\).
Uji Likelihood Ratio: Membandingkan model penuh dan model tereduksi.
Goodness-of-Fit: Menggunakan statistik deviance atau uji Hosmer-Lemeshow untuk menilai kecocokan model.
Contoh Kasus: Regresi Logistik
Kita akan membuat data fiktif untuk menganalisis hubungan antara Nyeri Dada (Typical Angina/Asymptomatic), Gender (Perempuan/Laki-Laki), dan Usia (kontinu) terhadap Status Penyakit Jantung (Terkena/Tidak Terkena). Respons adalah biner (Terkena = 1, Tidak Terkena = 0), sehingga kita gunakan regresi logistik.
Data Fiktif: Kita asumsikan 200 individu dengan variabel:
Nyeri Dada: 0 = Asymptomatic, 1 = Typical Angina.
Gender: 0 = Perempuan, 1 = Laki-Laki.
Usia: Usia dalam tahun (kontinu, rata-rata 50, deviasi standar 10).
Penyakit Jantung: 1 = Terkena, 0 = Tidak
set.seed(123)
n <- 200
data <- data.frame(
Nyeri_Dada = sample(c(0, 1), n, replace = TRUE, prob = c(0.55, 0.45)),
Gender = sample(c(0, 1), n, replace = TRUE, prob = c(0.52, 0.48)),
Usia = rnorm(n, mean = 50, sd = 10)
)
# Simulasi respons biner berdasarkan model logistik
eta <- -3 + 1.5 * data$Nyeri_Dada + 0.8 * data$Gender + 0.05 * data$Usia
pi <- exp(eta) / (1 + exp(eta))
data$Penyakit_Jantung <- rbinom(n, 1, pi)
kable(head(data), caption = "Cuplikan Data Fiktif")
Nyeri_Dada | Gender | Usia | Penyakit_Jantung |
---|---|---|---|
0 | 0 | 71.98810 | 1 |
1 | 1 | 63.12413 | 1 |
0 | 1 | 47.34855 | 1 |
1 | 0 | 55.43194 | 1 |
1 | 0 | 45.85660 | 1 |
0 | 1 | 45.23753 | 0 |
Model Logistik:
\(log\left( \frac{\pi_i}{1 - \pi_i} \right) = \beta_0 + \beta_1 \text{Nyeri\_Dada}_i + \beta_2 \text{Gender}_i + \beta_3 \text{Usia}_i\)
Di mana \(\pi_i = P(\text{Penyakit Jantung} = 1 | x_i)\).
####3.3.1 Estimasi Parameter
Kita sesuaikan model logistik menggunakan fungsi glm() di R.
model <- glm(Penyakit_Jantung ~ Nyeri_Dada + Gender + Usia,
family = binomial(link = "logit"),
data = data)
summary(model)
##
## Call:
## glm(formula = Penyakit_Jantung ~ Nyeri_Dada + Gender + Usia,
## family = binomial(link = "logit"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.01515 0.91407 -3.299 0.000972 ***
## Nyeri_Dada 2.07889 0.35940 5.784 7.28e-09 ***
## Gender 0.36426 0.33531 1.086 0.277328
## Usia 0.04937 0.01734 2.848 0.004406 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 269.20 on 199 degrees of freedom
## Residual deviance: 217.53 on 196 degrees of freedom
## AIC: 225.53
##
## Number of Fisher Scoring iterations: 4
Interpretasi Koefisien:
\(\exp(\hat{\beta}_j)\) adalah odds ratio untuk peningkatan satu unit pada prediktor \(x_j\).
\(\hat{\beta}_1 = 2.07\), maka \(\exp(2.07) \approx 7.92\), artinya individu dengan Typical Angina memiliki odds 7.92 kali lebih tinggi untuk terkena penyakit jantung dibandingkan Asymptomatic, dengan prediktor lain konstan.
####3.3.2 Uji Wald Uji Wald digunakan untuk menguji signifikansi individu koefisien:
\(z = \frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)}\)
Di mana \(z \sim N(0,1)\) di bawah \(H_0: \beta_j = 0\).
Jika p-value < 0.05, tolak ( H_0 ), artinya prediktor signifikan.
wald_results <- summary(model)$coefficients
kable(wald_results, caption = "Hasil Uji Wald")
Estimate | Std. Error | z value | Pr(>|z|) | |
---|---|---|---|---|
(Intercept) | -3.0151544 | 0.9140698 | -3.298604 | 0.0009717 |
Nyeri_Dada | 2.0788915 | 0.3594041 | 5.784274 | 0.0000000 |
Gender | 0.3642598 | 0.3353084 | 1.086342 | 0.2773276 |
Usia | 0.0493697 | 0.0173377 | 2.847534 | 0.0044059 |
Interpretasi:
Variabel Nyeri_Dada dan Usia signifikan.
Variabel Gender tidak berpengaruh signifikan dalam model.
Model secara umum punya variabel prediktor yang cukup relevan, tapi mungkin bisa dievaluasi lebih lanjut untuk pengaruh gender.
####3.3.3 Uji Likelihood Ratio Uji Likelihood Ratio (LRT) membandingkan model penuh dengan model tereduksi untuk menguji signifikansi prediktor.
Rumus: \(D = -2 \left( \log L(\text{model tereduksi}) - \log L(\text{model penuh}) \right)\)
\(D \sim \chi^2\) dengan derajat bebas = jumlah parameter yang diuji.
Contoh: Uji apakah semua prediktor (Nyeri Dada, Gender, Usia) secara bersama signifikan.
null_model <- glm(Penyakit_Jantung ~ 1, family = binomial(link = "logit"), data = data)
lrt <- anova(null_model, model, test = "Chisq")
kable(lrt, caption = "Uji Likelihood Ratio")
Resid. Df | Resid. Dev | Df | Deviance | Pr(>Chi) |
---|---|---|---|---|
199 | 269.2047 | NA | NA | NA |
196 | 217.5334 | 3 | 51.67124 | 0 |
####3.3.4 Goodness of Fit Deviance mengukur perbedaan antara model yang disesuaikan dan model jenuh (saturated model).
Rumus: \(D = -2 \left( \log L(\text{model disesuaikan}) - \log L(\text{model jenuh}) \right)\)
Deviance residual dihitung sebagai:
\(D_{\text{residual}} = \sum_{i=1}^n d_i^2, \quad d_i = \text{sign}(y_i - \hat{\pi}_i) \sqrt{-2 \left[ y_i \log(\hat{\pi}_i) + (1 - y_i) \log(1 - \hat{\pi}_i) \right]}\)
deviance <- summary(model)$deviance
df_residual <- summary(model)$df.residual
p_value_dev <- pchisq(deviance, df_residual, lower.tail = FALSE)
cat("Residual Deviance =", deviance, "\n")
## Residual Deviance = 217.5334
cat("Degrees of Freedom =", df_residual, "\n")
## Degrees of Freedom = 196
cat("P-value =", p_value_dev, "\n")
## P-value = 0.1392872
Didapat p-value(0.13) > 0.05, maka model cocok dengan data (tidak ada bukti kurang cocok).
###3.4 Prediksi dan Interpretasi Skenario:
Individu 1: Nyeri Dada = Typical Angina (1), Gender = Perempuan (0), Usia = 50.
Individu 2: Nyeri Dada = Asymptomatic (0), Gender = Laki-Laki (1), Usia = 60.
new_data <- data.frame(
Nyeri_Dada = c(1, 0),
Gender = c(0, 1),
Usia = c(50, 60)
)
pred_prob <- predict(model, newdata = new_data, type = "response")
pred_odds <- pred_prob / (1 - pred_prob)
kable(data.frame(new_data, Probabilitas = pred_prob, Odds = pred_odds),
caption = "Prediksi Probabilitas dan Odds")
Nyeri_Dada | Gender | Usia | Probabilitas | Odds |
---|---|---|---|---|
1 | 0 | 50 | 0.8223310 | 4.628445 |
0 | 1 | 60 | 0.5771992 | 1.365180 |
Interpretasi:
Probabilitas menunjukkan kemungkinan terkena penyakit jantung.
Odds memberikan rasio probabilitas sukses terhadap gagal.
GLM: Regresi logistik berhasil memodelkan hubungan antara Nyeri Dada, Gender, dan Usia terhadap Penyakit Jantung. Komponen acak (binomial), sistematik (kombinasi linear), dan fungsi link (logit) diterapkan dengan tepat.
Inferensi: Uji Wald menunjukkan prediktor mana yang signifikan. Uji Likelihood Ratio mengonfirmasi pentingnya model secara keseluruhan. Uji goodness-of-fit menilai kecocokan model. Aplikasi: Model ini dapat digunakan untuk memprediksi risiko penyakit jantung berdasarkan karakteristik individu.
Regresi logistik adalah model statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons biner (dengan dua kategori, seperti 0 dan 1) dengan satu atau lebih prediktor yang berskala nominal, ordinal, dan/atau rasio.
Model umum dari regresi logistik adalah:
\[ \log\left(\frac{\pi(x)}{1 - \pi(x)}\right) = \beta_0 + \beta_1X_1 + \cdots + \beta_pX_p \]
di mana \(\pi(x)\) adalah probabilitas kejadian (Y = 1), \(\beta\) adalah parameter yang ingin diestimasi, dan \(X\) adalah prediktor.
Regresi logistik cocok digunakan ketika data yang dianalisis bersifat kategorik atau binari dan kita ingin melihat pengaruh dari beberapa variabel independen yang bisa terdiri dari berbagai jenis skala pengukuran.
set.seed(123)
n <- 200
data10 <- tibble(
y = rbinom(n, 1, 0.5),
gender = factor(sample(c("L", "P"), n, TRUE)),
pendidikan = factor(sample(1:3, n, TRUE), labels = c("SMA", "D3", "S1"), ordered = TRUE),
umur = round(rnorm(n, 25, 5), 1)
)
Dalam regresi logistik, perlakuan terhadap variabel prediktor sangat penting:
data10$pendidikan_num <- as.numeric(data10$pendidikan)
model10 <- glm(y ~ gender + pendidikan_num + umur, data = data10, family = binomial)
summary(model10)
##
## Call:
## glm(formula = y ~ gender + pendidikan_num + umur, family = binomial,
## data = data10)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.655353 0.843328 0.777 0.4371
## genderP 0.019421 0.289062 0.067 0.9464
## pendidikan_num -0.368904 0.179826 -2.051 0.0402 *
## umur 0.001881 0.029760 0.063 0.9496
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 277.08 on 199 degrees of freedom
## Residual deviance: 272.76 on 196 degrees of freedom
## AIC: 280.76
##
## Number of Fisher Scoring iterations: 4
Koefisien dalam model logistik menunjukkan pengaruh log-odds dari setiap variabel prediktor terhadap probabilitas kejadian:
\[ OR_j = e^{\beta_j} \]
exp(coef(model10))
## (Intercept) genderP pendidikan_num umur
## 1.9258217 1.0196106 0.6914921 1.0018826
Uji Hosmer-Lemeshow mengukur kesesuaian model terhadap data:
# Uji goodness-of-fit (dengan penanganan error)
library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.4.3
## ResourceSelection 0.3-6 2023-06-27
hoslem.test(data10$y, fitted(model10), g = 10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: data10$y, fitted(model10)
## X-squared = 10.797, df = 8, p-value = 0.2135
Bab ini membahas cara memilih model terbaik dan mengevaluasi performanya.
Metode stepwise secara otomatis memilih prediktor yang optimal:
step_model <- step(model10, direction = "both")
## Start: AIC=280.76
## y ~ gender + pendidikan_num + umur
##
## Df Deviance AIC
## - umur 1 272.76 278.76
## - gender 1 272.76 278.76
## <none> 272.76 280.76
## - pendidikan_num 1 277.04 283.04
##
## Step: AIC=278.76
## y ~ gender + pendidikan_num
##
## Df Deviance AIC
## - gender 1 272.76 276.76
## <none> 272.76 278.76
## + umur 1 272.76 280.76
## - pendidikan_num 1 277.07 281.07
##
## Step: AIC=276.77
## y ~ pendidikan_num
##
## Df Deviance AIC
## <none> 272.76 276.76
## + gender 1 272.76 278.76
## + umur 1 272.76 278.76
## - pendidikan_num 1 277.08 279.08
ROC digunakan untuk mengevaluasi kinerja klasifikasi model. AUC (Area Under Curve) mengukur kemampuan model dalam membedakan kelas.
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.2
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
pred <- predict(model10, type = "response")
roc10 <- roc(data10$y, pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc10, col = "blue")
auc(roc10)
## Area under the curve: 0.5784
Nilai pseudo \(R^2\) memberikan ukuran kekuatan model, mirip dengan \(R^2\) dalam regresi linear.
null_model <- glm(y ~ 1, data = data10, family = binomial)
1 - (logLik(model10) / logLik(null_model)) # McFadden's R²
## 'log Lik.' 0.01560203 (df=4)
Distribusi multinomial adalah generalisasi dari distribusi binomial untuk lebih dari dua kategori.
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1!x_2!...x_k!} p_1^{x_1} \cdots p_k^{x_k} \]
n <- 10
x <- c(4, 3, 3)
p <- c(0.3, 0.4, 0.3)
prob <- factorial(n)/prod(factorial(x)) * prod(p^x)
prob
## [1] 0.05878656
Regresi ini digunakan ketika variabel dependen memiliki lebih dari dua kategori dan tidak berurutan.
library(nnet)
## Warning: package 'nnet' was built under R version 4.4.3
data(iris)
model12 <- multinom(Species ~ Petal.Length + Petal.Width, data = iris)
## # weights: 12 (6 variable)
## initial value 164.791843
## iter 10 value 12.657828
## iter 20 value 10.374056
## iter 30 value 10.330881
## iter 40 value 10.306926
## iter 50 value 10.300057
## iter 60 value 10.296452
## iter 70 value 10.294046
## iter 80 value 10.292029
## iter 90 value 10.291154
## iter 100 value 10.289505
## final value 10.289505
## stopped after 100 iterations
summary(model12)
## Call:
## multinom(formula = Species ~ Petal.Length + Petal.Width, data = iris)
##
## Coefficients:
## (Intercept) Petal.Length Petal.Width
## versicolor -22.79944 6.92122 7.878496
## virginica -67.82521 12.64721 18.261016
##
## Std. Errors:
## (Intercept) Petal.Length Petal.Width
## versicolor 44.3859 37.58715 81.00888
## virginica 46.3939 37.65702 81.09482
##
## Residual Deviance: 20.57901
## AIC: 32.57901
Koefisien dari model ini merepresentasikan perubahan log-odds antara setiap kelas target dibandingkan kelas referensi.
Regresi logistik ordinal digunakan jika variabel respon bersifat kategorik dan terurut (ordinal).
Model yang digunakan adalah model logit kumulatif:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
set.seed(123)
speed <- round(runif(200, 1, 10))
satisfaction <- cut(5 + 0.5*speed + rnorm(200),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
df13 <- data.frame(satisfaction, speed)
model13 <- polr(satisfaction ~ speed, data = df13, Hess = TRUE)
summary(model13)
## Call:
## polr(formula = satisfaction ~ speed, data = df13, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## speed 0.9096 0.1094 8.315
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 1.3015 0.4377 2.9738
## Cukup|Puas 4.4734 0.5718 7.8232
##
## Residual Deviance: 237.2312
## AIC: 243.2312
library(brant)
## Warning: package 'brant' was built under R version 4.4.3
brant(model13)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 1.13 1 0.29
## speed 1.13 1 0.29
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Uji Brant digunakan untuk mengecek apakah asumsi paralelisme dalam model ordinal dipenuhi.
Model log-linier digunakan untuk menganalisis hubungan antara variabel kategorik dalam tabel kontingensi.
Model umum:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
data_survey <- matrix(c(32, 190, 113, 611, 51, 326),
nrow = 3, byrow = TRUE,
dimnames = list(Kebahagiaan = c("Tidak", "Cukup", "Sangat"),
Surga = c("Tidak Percaya", "Percaya")))
ftable(data_survey)
## Surga Tidak Percaya Percaya
## Kebahagiaan
## Tidak 32 190
## Cukup 113 611
## Sangat 51 326
loglm(~ Kebahagiaan + Surga, data = data_survey)
## Call:
## loglm(formula = ~Kebahagiaan + Surga, data = data_survey)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.8911136 2 0.6404675
## Pearson 0.8836760 2 0.6428538
Ukuran asosiasi dalam tabel 2x2:
\[ OR = \frac{n_{11}n_{22}}{n_{12}n_{21}} \]
Interpretasi odds ratio menunjukkan seberapa besar peluang antara dua kategori dibandingkan.