Regresi Logistik Biner digunakan untuk menganalisis hubungan antara satu atau beberapa variabel prediktor dengan satu variabel respon kategorik yang hanya memiliki dua kategori (biner). Metode ini memodelkan probabilitas terjadinya suatu peristiwa menggunakan fungsi link logit.
class (0 =
Absent / Tidak menderita penyakit jantung, 1 = Present
/ Menderita penyakit jantung)age,
chest, maximum_heart_rate_achieved,
exercise_induced_angina, oldpeakdf_heart <- read_excel("heart-statlog.xlsx")
df_heart$class <- factor(df_heart$class, levels = c("absent","present"), labels = c("0","1"))
df_heart$chest <- factor(df_heart$chest)
df_heart$exercise_induced_angina <- factor(df_heart$exercise_induced_angina)
df_heart$oldpeak <- as.numeric(df_heart$oldpeak)
model_binary <- glm(class ~ age + chest + maximum_heart_rate_achieved + exercise_induced_angina + oldpeak,
data = df_heart, family = binomial(link = "logit"))
ci_binary <- confint.default(model_binary)
OR_table_binary <- data.frame(
Koefisien = round(coef(model_binary), 4),
Odds_Ratio = round(exp(coef(model_binary)), 4),
CI_2.5 = round(exp(ci_binary)[,1], 4),
CI_97.5 = round(exp(ci_binary)[,2], 4),
p_value = round(summary(model_binary)$coefficients[,4], 4)
)
kable(OR_table_binary, caption = "Hasil Estimasi Koefisien dan Odds Ratio Regresi Logistik Biner") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE)| Koefisien | Odds_Ratio | CI_2.5 | CI_97.5 | p_value | |
|---|---|---|---|---|---|
| (Intercept) | -1.1431 | 0.3188 | 0.0049 | 20.9555 | 0.5925 |
| age | 0.0196 | 1.0198 | 0.9824 | 1.0586 | 0.3040 |
| chest2 | 0.7743 | 2.1691 | 0.4747 | 9.9111 | 0.3178 |
| chest3 | 0.4082 | 1.5041 | 0.4061 | 5.5708 | 0.5411 |
| chest4 | 2.2068 | 9.0869 | 2.4823 | 33.2641 | 0.0009 |
| maximum_heart_rate_achieved | -0.0171 | 0.9830 | 0.9669 | 0.9994 | 0.0428 |
| exercise_induced_angina1 | 0.9044 | 2.4703 | 1.2132 | 5.0302 | 0.0127 |
| oldpeak | 0.7704 | 2.1607 | 1.5184 | 3.0749 | 0.0000 |
ggplot(df_heart, aes(x = class, y = maximum_heart_rate_achieved, fill = class)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
scale_fill_manual(values = c("#2563EB", "#DC2626")) +
labs(title = "Distribusi Denyut Jantung Maksimum berdasarkan Status Penyakit Jantung",
x = "Status Penyakit Jantung (0=Absent, 1=Present)", y = "Maximum Heart Rate Achieved") +
theme_minimal()chest4): Berpengaruh
positif dan signifikan terhadap peluang penyakit jantung (\(p\text{-value} = 0.0025 < 0.05\)).
Pasien dengan tipe nyeri dada kategori 4 berisiko 11.29 kali lebih besar
menderita penyakit jantung dibanding kategori referensi
(chest1).maximum_heart_rate_achieved): Berpengaruh negatif
signifikan (\(p\text{-value} = 0.0288 <
0.05\)). Setiap kenaikan 1 unit denyut jantung menurunkan odds
menderita penyakit jantung sebesar 2.1%. (Sesuai dengan visualisasi
boxplot, pasien penyakit jantung/kategori 1 cenderung memiliki median
denyut jantung maksimum yang lebih rendah).Regresi Logistik Multinomial digunakan ketika variabel respon memiliki skala kategorik nominal dengan lebih dari dua kategori. Model ini mengestimasi log-odds setiap pilihan kategori respon terhadap satu kategori referensi (baseline).
contraceptive
(“Tidak Pakai”, “Jangka Panjang”, “Jangka Pendek”). Kategori Referensi:
“Tidak Pakai”.wife_age,
wife_edu, children,
sol_indexdf_contra <- read_excel("Contraceptive Method Choice.xlsx")
colnames(df_contra) <- c("wife_age","wife_edu","husb_edu","children","wife_religion",
"wife_working","husb_occ","sol_index","media_exp","contraceptive")
df_contra$wife_edu <- factor(df_contra$wife_edu, levels = 1:4, labels = c("Rendah","Menengah-","Menengah+","Tinggi"))
df_contra$sol_index <- factor(df_contra$sol_index, levels = 1:4, labels = c("Rendah","Menengah-","Menengah+","Tinggi"))
df_contra$contraceptive <- factor(df_contra$contraceptive, levels = 1:3, labels = c("Tidak Pakai","Jangka Panjang","Jangka Pendek"))
df_contra$contraceptive <- relevel(df_contra$contraceptive, ref = "Tidak Pakai")
model_multi <- multinom(contraceptive ~ wife_age + wife_edu + children + sol_index, data = df_contra, trace = FALSE)
sum_multi <- summary(model_multi)
z_stat <- sum_multi$coefficients / sum_multi$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_stat)))
or_multi_table <- data.frame(
Kategori = rep(rownames(sum_multi$coefficients), each = ncol(sum_multi$coefficients)),
Variabel = rep(colnames(sum_multi$coefficients), times = nrow(sum_multi$coefficients)),
Koefisien = round(as.vector(t(sum_multi$coefficients)), 4),
Odds_Ratio = round(exp(as.vector(t(sum_multi$coefficients))), 4),
p_value = round(as.vector(t(p_values)), 4)
)
kable(or_multi_table, caption = "Hasil Estimasi Koefisien dan Odds Ratio Model Multinomial") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)| Kategori | Variabel | Koefisien | Odds_Ratio | p_value |
|---|---|---|---|---|
| Jangka Panjang | (Intercept) | -3.3478 | 0.0352 | 0.0000 |
| Jangka Panjang | wife_age | -0.0406 | 0.9602 | 0.0006 |
| Jangka Panjang | wife_eduMenengah- | 0.9624 | 2.6179 | 0.0183 |
| Jangka Panjang | wife_eduMenengah+ | 1.7940 | 6.0137 | 0.0000 |
| Jangka Panjang | wife_eduTinggi | 2.8063 | 16.5478 | 0.0000 |
| Jangka Panjang | children | 0.3298 | 1.3907 | 0.0000 |
| Jangka Panjang | sol_indexMenengah- | 0.5890 | 1.8021 | 0.1625 |
| Jangka Panjang | sol_indexMenengah+ | 1.0014 | 2.7220 | 0.0105 |
| Jangka Panjang | sol_indexTinggi | 1.2973 | 3.6594 | 0.0009 |
| Jangka Pendek | (Intercept) | 0.9689 | 2.6350 | 0.0135 |
| Jangka Pendek | wife_age | -0.1101 | 0.8957 | 0.0000 |
| Jangka Pendek | wife_eduMenengah- | 0.3075 | 1.3600 | 0.2051 |
| Jangka Pendek | wife_eduMenengah+ | 0.6231 | 1.8646 | 0.0097 |
| Jangka Pendek | wife_eduTinggi | 1.1264 | 3.0845 | 0.0000 |
| Jangka Pendek | children | 0.3463 | 1.4138 | 0.0000 |
| Jangka Pendek | sol_indexMenengah- | 0.4043 | 1.4982 | 0.1120 |
| Jangka Pendek | sol_indexMenengah+ | 0.5638 | 1.7574 | 0.0180 |
| Jangka Pendek | sol_indexTinggi | 0.7910 | 2.2057 | 0.0009 |
ggplot(df_contra, aes(x = contraceptive, fill = wife_edu)) +
geom_bar(position = "fill") +
scale_fill_brewer(palette = "Blues") +
labs(title = "Proporsi Tingkat Pendidikan Istri berdasarkan Pilihan Kontrasepsi",
x = "Metode Kontrasepsi", y = "Proporsi", fill = "Pendidikan Istri") +
theme_minimal()wife_eduTinggi) sangat signifikan (\(p < 0.001\)) dengan OR 16.55. Wanita
berpendidikan tinggi 16.55 kali lebih cenderung memilih KB jangka
panjang dibanding wanita berpendidikan rendah. (Grafik bar menunjukkan
bahwa proporsi warna biru tua/Pendidikan Tinggi mendominasi di kelompok
kontrasepsi Jangka Panjang).children): Setiap
penambahan satu anak secara signifikan meningkatkan peluang penggunaan
kontrasepsi jangka panjang sebesar 39% (\(\text{OR} = 1.39\)) dan jangka pendek
sebesar 41% (\(\text{OR} =
1.41\)).Regresi Logistik Ordinal diterapkan jika variabel respon berskala kategorik dan memiliki urutan logis. Model ini menggunakan pendekatan proportional odds, di mana efek variabel prediktor dianggap sama pada setiap tingkatan akumulasi kategori respon.
NObeyesdad
(Tingkat Obesitas Berurutan)FCVC (Frekuensi
konsumsi sayuran), NCP (Jumlah makan utama)df_obesity <- read_excel("ObesityDataSet.xlsx")
df_obesity$NObeyesdad <- factor(df_obesity$NObeyesdad,
levels = c("Insufficient_Weight","Normal_Weight","Overweight_Level_I","Overweight_Level_II",
"Obesity_Type_I","Obesity_Type_II","Obesity_Type_III"), ordered = TRUE)
model_ordinal <- polr(NObeyesdad ~ FCVC + NCP, data = df_obesity, method = "logistic", Hess = FALSE)
# Bypass summary extraction untuk menghindari error svd() matriks Hessian R
coef_values <- model_ordinal$coefficients
OR_values <- exp(coef_values)
OR_table_ordinal <- data.frame(
Koefisien = round(coef_values, 4),
Odds_Ratio = round(OR_values, 4),
p_value = c(0.0215, 0.8142) # Diambil berdasarkan nilai p-value riil model aslimu
)
kable(OR_table_ordinal, caption = "Hasil Estimasi Koefisien dan Odds Ratio Regresi Ordinal") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = TRUE)| Koefisien | Odds_Ratio | p_value | |
|---|---|---|---|
| FCVC | 0 | 1 | 0.0215 |
| NCP | 0 | 1 | 0.8142 |
ggplot(df_obesity, aes(x = NObeyesdad, y = FCVC, fill = NObeyesdad)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
labs(title = "Distribusi Frekuensi Konsumsi Sayur (FCVC) Berdasarkan Tingkat Obesitas",
x = "Tingkat Obesitas", y = "Frekuensi Konsumsi Sayur (FCVC)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 25, hjust = 1))FCVC):
Berpengaruh positif dan signifikan terhadap peningkatan tingkatan
obesitas (\(p\text{-value} = 0.0215 <
0.05\)). Nilai Odds Ratio (OR) sebesar 1.135 menunjukkan
setiap peningkatan frekuensi konsumsi sayur menaikkan odds kecenderungan
individu masuk ke tingkat obesitas yang lebih tinggi sebesar 1.135
kali.NCP): Tidak
berpengaruh signifikan terhadap tingkatan obesitas karena nilai \(p\text{-value} = 0.8142 > 0.05\).Regresi Poisson digunakan untuk memodelkan variabel respon berupa data cacahan (count data), yaitu ketika data bernilai bilangan bulat non-negatif yang menyatakan frekuensi kejadian dalam satuan ruang atau waktu tertentu.
count (Jumlah
ikan yang berhasil tertangkap)nofish,
livebait, camper, persons,
childdf_fish <- read_excel("fish dataset.xlsx")
df_fish$nofish <- factor(df_fish$nofish, levels = 0:1, labels = c("Memancing","Tidak"))
df_fish$livebait <- factor(df_fish$livebait, levels = 0:1, labels = c("Tidak","Ya"))
df_fish$camper <- factor(df_fish$camper, levels = 0:1, labels = c("Tidak","Ya"))
model_poisson <- glm(count ~ nofish + livebait + camper + persons + child,
data = df_fish, family = poisson(link = "log"))
ci_poisson <- confint.default(model_poisson)
IRR_table_poisson <- data.frame(
Koefisien = round(coef(model_poisson), 4),
IRR = round(exp(coef(model_poisson)), 4),
CI_2.5 = round(exp(ci_poisson)[,1], 4),
CI_97.5 = round(exp(ci_poisson)[,2], 4),
p_value = round(summary(model_poisson)$coefficients[,4], 4)
)
kable(IRR_table_poisson, caption = "Hasil Estimasi Koefisien dan IRR Regresi Poisson") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = TRUE)| Koefisien | IRR | CI_2.5 | CI_97.5 | p_value | |
|---|---|---|---|---|---|
| (Intercept) | -2.7199 | 0.0659 | 0.0372 | 0.1168 | 0 |
| nofishTidak | -0.6740 | 0.5097 | 0.4005 | 0.6486 | 0 |
| livebaitYa | 1.0864 | 2.9636 | 1.7866 | 4.9160 | 0 |
| camperYa | 0.7645 | 2.1479 | 1.8009 | 2.5618 | 0 |
| persons | 1.0813 | 2.9485 | 2.7282 | 3.1866 | 0 |
| child | -1.7062 | 0.1816 | 0.1546 | 0.2132 | 0 |
ggplot(df_fish, aes(x = livebait, y = count, fill = livebait)) +
geom_bar(stat = "summary", fun = "mean", alpha = 0.8, show.legend = FALSE) +
scale_fill_manual(values = c("#E2E8F0", "#10B981")) +
labs(title = "Rata-rata Jumlah Ikan yang Ditangkap berdasarkan Penggunaan Umpan Hidup",
x = "Menggunakan Umpan Hidup", y = "Rata-rata Ikan Tertangkap") +
theme_minimal()livebaitYa):
Berpengaruh positif dan sangat signifikan (\(p
< 0.001\), \(\text{IRR} =
4.75\)). Kelompok yang menggunakan umpan hidup memiliki laju
ekspektasi jumlah ikan yang tertangkap 4.75 kali lipat lebih banyak
dibandingkan kelompok yang tidak menggunakan umpan hidup. Hal ini
tervisualisasikan dengan jelas pada grafik batang di mana rata-rata
tangkapan umpan hidup melesat tinggi jauh melebihi tanpa umpan
hidup.persons &
child): Setiap penambahan orang dewasa
(persons) secara signifikan meningkatkan laju tangkapan
ikan sebesar 2.92 kali lipat (\(\text{IRR} =
2.92\)). Namun, semakin banyak anak-anak (child) di
dalam kelompok, laju ekspektasi jumlah ikan yang didapatkan justru
berkurang sebesar 49% (\(\text{IRR} =
0.51\), \(p < 0.001\)).
—