Dokumen ini membahas tiga jenis pemodelan regresi untuk variabel dependen non-kontinu:
| Model | Variabel Dependen | Contoh |
|---|---|---|
| Regresi Multinomial | Kategorik nominal (≥3 kategori) | Pilihan moda transportasi |
| Regresi Ordinal | Kategorik ordinal (berurutan) | Tingkat kepuasan (Rendah/Sedang/Tinggi) |
| Regresi Poisson | Count data (cacahan) | Jumlah kunjungan ke rumah sakit |
# Install jika belum ada
# install.packages(c("nnet", "MASS", "ggplot2", "dplyr", "knitr", "kableExtra", "broom", "effects"))
library(nnet) # Regresi Multinomial
library(MASS) # Regresi Ordinal (polr)
library(ggplot2) # Visualisasi
library(dplyr) # Manipulasi data
library(knitr) # Tabel
library(kableExtra) # Styling tabel
library(broom) # Tidy output model
library(effects) # Effect plotsRegresi Logistik Multinomial digunakan ketika variabel dependen bersifat kategorik nominal dengan lebih dari dua kategori, tanpa urutan tertentu.
Studi Kasus: Pemilihan Moda Transportasi oleh mahasiswa berdasarkan:
pendapatan: Pendapatan bulanan (ribu rupiah)jarak: Jarak tempuh ke kampus (km)usia: Usia mahasiswa (tahun)Variabel dependen: transportasi → Motor,
Angkot, Ojek Online
set.seed(42)
n <- 300
data_transport <- data.frame(
pendapatan = round(rnorm(n, mean = 2500, sd = 800)),
jarak = round(runif(n, min = 1, max = 30), 1),
usia = round(rnorm(n, mean = 21, sd = 2))
)
# Probabilitas transportasi berdasarkan covariat
logit_angkot <- with(data_transport, -1.5 + 0.0003 * pendapatan - 0.05 * jarak)
logit_ojol <- with(data_transport, -0.5 - 0.0005 * pendapatan + 0.08 * jarak)
prob_motor <- 1 / (1 + exp(logit_angkot) + exp(logit_ojol))
prob_angkot <- exp(logit_angkot) / (1 + exp(logit_angkot) + exp(logit_ojol))
prob_ojol <- exp(logit_ojol) / (1 + exp(logit_angkot) + exp(logit_ojol))
data_transport$transportasi <- apply(
cbind(prob_motor, prob_angkot, prob_ojol), 1,
function(p) sample(c("Motor", "Angkot", "Ojek Online"), 1, prob = p)
)
data_transport$transportasi <- factor(data_transport$transportasi,
levels = c("Motor", "Angkot", "Ojek Online"))
# Tampilkan 10 baris pertama
head(data_transport, 10) %>%
kable(caption = "10 Baris Pertama Data Transportasi") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| pendapatan | jarak | usia | transportasi |
|---|---|---|---|
| 3597 | 15.4 | 18 | Motor |
| 2048 | 9.2 | 20 | Angkot |
| 2791 | 23.5 | 21 | Motor |
| 3006 | 9.8 | 20 | Ojek Online |
| 2823 | 16.0 | 21 | Motor |
| 2415 | 14.9 | 20 | Ojek Online |
| 3709 | 23.3 | 24 | Ojek Online |
| 2424 | 5.8 | 22 | Motor |
| 4115 | 13.8 | 27 | Motor |
| 2450 | 16.2 | 19 | Motor |
## Dimensi Data: 300 baris x 4 kolom
## Distribusi Variabel Dependen:
table(data_transport$transportasi) %>%
as.data.frame() %>%
rename(Transportasi = Var1, Frekuensi = Freq) %>%
mutate(Persentase = paste0(round(Frekuensi / sum(Frekuensi) * 100, 1), "%")) %>%
kable(caption = "Distribusi Pilihan Transportasi") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)| Transportasi | Frekuensi | Persentase |
|---|---|---|
| Motor | 158 | 52.7% |
| Angkot | 40 | 13.3% |
| Ojek Online | 102 | 34% |
ggplot(data_transport, aes(x = transportasi, fill = transportasi)) +
geom_bar(color = "white", width = 0.6) +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, fontface = "bold") +
scale_fill_manual(values = c("#2196F3", "#FF5722", "#4CAF50")) +
labs(title = "Distribusi Pilihan Moda Transportasi Mahasiswa",
x = "Moda Transportasi", y = "Jumlah Mahasiswa",
fill = "Transportasi") +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5))# Referensi: Motor
data_transport$transportasi <- relevel(data_transport$transportasi, ref = "Motor")
# Fitting model
model_multinom <- multinom(transportasi ~ pendapatan + jarak + usia,
data = data_transport, trace = FALSE)
summary(model_multinom)## Call:
## multinom(formula = transportasi ~ pendapatan + jarak + usia,
## data = data_transport, trace = FALSE)
##
## Coefficients:
## (Intercept) pendapatan jarak usia
## Angkot 0.6921144 0.0003345827 -0.01532962 -0.13189315
## Ojek Online -0.1159848 -0.0004333213 0.10839563 -0.05107983
##
## Std. Errors:
## (Intercept) pendapatan jarak usia
## Angkot 0.001318934 0.0002225797 0.02326696 0.03100804
## Ojek Online 0.001016586 0.0001784969 0.01825500 0.02352209
##
## Residual Deviance: 528.4365
## AIC: 544.4365
# Koefisien dalam bentuk tidy
tidy_multinom <- tidy(model_multinom)
tidy_multinom %>%
mutate(
estimate = round(estimate, 4),
std.error = round(std.error, 4),
statistic = round(statistic, 4),
p.value = round(p.value, 4),
signif = case_when(p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.1 ~ ".",
TRUE ~ "")
) %>%
kable(caption = "Hasil Estimasi Parameter Regresi Multinomial") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| y.level | term | estimate | std.error | statistic | p.value | signif |
|---|---|---|---|---|---|---|
| Angkot | (Intercept) | 0.6921 | 0.0013 | 524.7529 | 0.0000 | *** |
| Angkot | pendapatan | 0.0003 | 0.0002 | 1.5032 | 0.1328 | |
| Angkot | jarak | -0.0153 | 0.0233 | -0.6589 | 0.5100 | |
| Angkot | usia | -0.1319 | 0.0310 | -4.2535 | 0.0000 | *** |
| Ojek Online | (Intercept) | -0.1160 | 0.0010 | -114.0924 | 0.0000 | *** |
| Ojek Online | pendapatan | -0.0004 | 0.0002 | -2.4276 | 0.0152 |
|
| Ojek Online | jarak | 0.1084 | 0.0183 | 5.9379 | 0.0000 | *** |
| Ojek Online | usia | -0.0511 | 0.0235 | -2.1716 | 0.0299 |
|
# Odds Ratio
exp(coef(model_multinom)) %>%
as.data.frame() %>%
round(4) %>%
kable(caption = "Odds Ratio Regresi Multinomial") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| (Intercept) | pendapatan | jarak | usia | |
|---|---|---|---|---|
| Angkot | 1.9979 | 1.0003 | 0.9848 | 0.8764 |
| Ojek Online | 0.8905 | 0.9996 | 1.1145 | 0.9502 |
Interpretasi:
- Angkot vs Motor: Setiap kenaikan 1 ribu rupiah pendapatan, odds memilih Angkot dibanding Motor berubah sesuai koefisien pendapatan.
- Ojek Online vs Motor: Setiap penambahan 1 km jarak, peluang memilih Ojek Online relatif terhadap Motor cenderung meningkat.
# Prediksi dan akurasi
pred_multinom <- predict(model_multinom, data_transport)
akurasi <- mean(pred_multinom == data_transport$transportasi)
cat("Akurasi Model Multinomial:", round(akurasi * 100, 2), "%\n")## Akurasi Model Multinomial: 58.33 %
# Confusion matrix
conf_mat <- table(Prediksi = pred_multinom, Aktual = data_transport$transportasi)
conf_mat %>%
kable(caption = "Confusion Matrix Regresi Multinomial") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)| Motor | Angkot | Ojek Online | |
|---|---|---|---|
| Motor | 129 | 30 | 56 |
| Angkot | 0 | 0 | 0 |
| Ojek Online | 29 | 10 | 46 |
Regresi Logistik Ordinal (Proportional Odds Model) digunakan ketika variabel dependen bersifat kategorik dengan urutan (ordinal), namun jarak antar kategori tidak diketahui.
Studi Kasus: Tingkat Kepuasan Pasien di Puskesmas berdasarkan:
waktu_tunggu: Lama waktu tunggu (menit)kualitas_layanan: Skor kualitas layanan (1–10)biaya: Biaya berobat (ribu rupiah)Variabel dependen: kepuasan → Tidak Puas <
Cukup Puas < Puas < Sangat Puas
set.seed(123)
n2 <- 250
data_kepuasan <- data.frame(
waktu_tunggu = round(runif(n2, 10, 120)),
kualitas_layanan = round(runif(n2, 1, 10), 1),
biaya = round(rnorm(n2, 50, 20))
)
# Skor laten kepuasan
skor_laten <- with(data_kepuasan,
3 - 0.02 * waktu_tunggu + 0.4 * kualitas_layanan - 0.01 * biaya + rnorm(n2, 0, 0.8)
)
# Kategorisasi berdasarkan kuantil
cuts <- quantile(skor_laten, probs = c(0, 0.2, 0.45, 0.75, 1))
data_kepuasan$kepuasan <- cut(skor_laten, breaks = cuts,
labels = c("Tidak Puas", "Cukup Puas", "Puas", "Sangat Puas"),
include.lowest = TRUE)
data_kepuasan$kepuasan <- factor(data_kepuasan$kepuasan,
levels = c("Tidak Puas", "Cukup Puas", "Puas", "Sangat Puas"),
ordered = TRUE)
head(data_kepuasan, 10) %>%
kable(caption = "10 Baris Pertama Data Kepuasan Pasien") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| waktu_tunggu | kualitas_layanan | biaya | kepuasan |
|---|---|---|---|
| 42 | 3.3 | 42 | Cukup Puas |
| 97 | 3.0 | 39 | Tidak Puas |
| 55 | 6.3 | 43 | Sangat Puas |
| 107 | 3.4 | 52 | Cukup Puas |
| 113 | 5.8 | 82 | Tidak Puas |
| 15 | 8.1 | 48 | Sangat Puas |
| 68 | 2.5 | 72 | Tidak Puas |
| 108 | 4.6 | 63 | Tidak Puas |
| 71 | 5.2 | 48 | Puas |
| 60 | 8.8 | 19 | Sangat Puas |
table(data_kepuasan$kepuasan) %>%
as.data.frame() %>%
rename(Kepuasan = Var1, Frekuensi = Freq) %>%
mutate(Persentase = paste0(round(Frekuensi / sum(Frekuensi) * 100, 1), "%")) %>%
kable(caption = "Distribusi Tingkat Kepuasan Pasien") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)| Kepuasan | Frekuensi | Persentase |
|---|---|---|
| Tidak Puas | 50 | 20% |
| Cukup Puas | 63 | 25.2% |
| Puas | 74 | 29.6% |
| Sangat Puas | 63 | 25.2% |
ggplot(data_kepuasan, aes(x = kepuasan, fill = kepuasan)) +
geom_bar(color = "white", width = 0.6) +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, fontface = "bold") +
scale_fill_manual(values = c("#E53935", "#FB8C00", "#43A047", "#1E88E5")) +
labs(title = "Distribusi Tingkat Kepuasan Pasien Puskesmas",
x = "Tingkat Kepuasan", y = "Jumlah Pasien") +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5))model_ordinal <- polr(kepuasan ~ waktu_tunggu + kualitas_layanan + biaya,
data = data_kepuasan, Hess = TRUE, method = "logistic")
summary(model_ordinal)## Call:
## polr(formula = kepuasan ~ waktu_tunggu + kualitas_layanan + biaya,
## data = data_kepuasan, Hess = TRUE, method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## waktu_tunggu -0.04045 0.005083 -7.958
## kualitas_layanan 0.81832 0.072353 11.310
## biaya -0.02791 0.006536 -4.270
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup Puas -2.4685 0.5602 -4.4067
## Cukup Puas|Puas -0.1113 0.5249 -0.2121
## Puas|Sangat Puas 2.4289 0.5635 4.3103
##
## Residual Deviance: 449.8171
## AIC: 461.8171
# Hitung p-value manual (t-distribution)
ctable <- coef(summary(model_ordinal))
p_vals <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
hasil_ordinal <- cbind(ctable, `p value` = round(p_vals, 4))
hasil_ordinal %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(.x, 4))) %>%
kable(caption = "Hasil Estimasi Parameter Regresi Ordinal") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Value | Std. Error | t value | p value | |
|---|---|---|---|---|
| waktu_tunggu | -0.0405 | 0.0051 | -7.9581 | 0.0000 |
| kualitas_layanan | 0.8183 | 0.0724 | 11.3101 | 0.0000 |
| biaya | -0.0279 | 0.0065 | -4.2703 | 0.0000 |
| Tidak Puas|Cukup Puas | -2.4685 | 0.5602 | -4.4067 | 0.0000 |
| Cukup Puas|Puas | -0.1113 | 0.5249 | -0.2121 | 0.8321 |
| Puas|Sangat Puas | 2.4289 | 0.5635 | 4.3103 | 0.0000 |
# Odds Ratio
exp(coef(model_ordinal)) %>%
as.data.frame() %>%
rename(`Odds Ratio` = ".") %>%
mutate(`Odds Ratio` = round(`Odds Ratio`, 4)) %>%
kable(caption = "Odds Ratio Regresi Ordinal") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)| Odds Ratio | |
|---|---|
| waktu_tunggu | 0.9604 |
| kualitas_layanan | 2.2667 |
| biaya | 0.9725 |
Interpretasi:
- Waktu Tunggu: OR < 1 → semakin lama waktu tunggu, odds berada di kategori kepuasan lebih tinggi menurun.
- Kualitas Layanan: OR > 1 → semakin tinggi skor kualitas layanan, odds berada di kategori kepuasan lebih tinggi meningkat.
# Visualisasi probabilitas prediksi vs kualitas layanan
kual_seq <- seq(1, 10, by = 0.5)
pred_df <- data.frame(
waktu_tunggu = median(data_kepuasan$waktu_tunggu),
kualitas_layanan = kual_seq,
biaya = median(data_kepuasan$biaya)
)
pred_prob <- predict(model_ordinal, newdata = pred_df, type = "probs") %>%
as.data.frame()
pred_prob$kualitas_layanan <- kual_seq
pred_long <- tidyr::pivot_longer(pred_prob, -kualitas_layanan,
names_to = "Kepuasan", values_to = "Probabilitas")
pred_long$Kepuasan <- factor(pred_long$Kepuasan,
levels = c("Tidak Puas", "Cukup Puas", "Puas", "Sangat Puas"))
ggplot(pred_long, aes(x = kualitas_layanan, y = Probabilitas, color = Kepuasan)) +
geom_line(size = 1.2) +
scale_color_manual(values = c("#E53935", "#FB8C00", "#43A047", "#1E88E5")) +
labs(title = "Probabilitas Prediksi Kepuasan vs Kualitas Layanan",
subtitle = "(Waktu tunggu & biaya pada nilai median)",
x = "Skor Kualitas Layanan", y = "Probabilitas", color = "Kepuasan") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))Regresi Poisson digunakan untuk memodelkan data cacahan (count data) — yaitu jumlah kejadian dalam suatu interval waktu atau ruang tertentu.
Asumsi utama: Rata-rata = Variansi (Equidispersion)
Studi Kasus: Jumlah Kunjungan ke Dokter dalam setahun berdasarkan:
usia: Usia pasien (tahun)penyakit_kronis: Memiliki penyakit kronis (0/1)asuransi: Memiliki asuransi kesehatan (0/1)bmi: Indeks Massa Tubuhset.seed(99)
n3 <- 350
data_kunjungan <- data.frame(
usia = round(runif(n3, 18, 75)),
penyakit_kronis = rbinom(n3, 1, 0.3),
asuransi = rbinom(n3, 1, 0.55),
bmi = round(rnorm(n3, 24, 4.5), 1)
)
# Log-linear model untuk lambda
log_lambda <- with(data_kunjungan,
0.5 + 0.015 * usia + 0.8 * penyakit_kronis + 0.4 * asuransi + 0.03 * bmi
)
data_kunjungan$kunjungan <- rpois(n3, lambda = exp(log_lambda))
head(data_kunjungan, 10) %>%
kable(caption = "10 Baris Pertama Data Kunjungan Dokter") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| usia | penyakit_kronis | asuransi | bmi | kunjungan |
|---|---|---|---|---|
| 51 | 1 | 1 | 20.6 | 14 |
| 24 | 0 | 1 | 19.7 | 9 |
| 57 | 0 | 1 | 20.0 | 6 |
| 75 | 0 | 1 | 26.3 | 18 |
| 48 | 1 | 0 | 28.1 | 22 |
| 73 | 0 | 0 | 24.9 | 5 |
| 56 | 1 | 1 | 22.7 | 26 |
| 35 | 1 | 1 | 24.8 | 23 |
| 38 | 1 | 1 | 27.8 | 20 |
| 28 | 1 | 1 | 18.8 | 19 |
## Statistik Variabel Kunjungan:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 7.00 10.50 12.69 16.75 48.00
##
## Mean : 12.694
##
## Varians: 60.74
ggplot(data_kunjungan, aes(x = kunjungan)) +
geom_histogram(binwidth = 1, fill = "#5C6BC0", color = "white", alpha = 0.85) +
labs(title = "Distribusi Jumlah Kunjungan ke Dokter per Tahun",
x = "Jumlah Kunjungan", y = "Frekuensi") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))model_poisson <- glm(kunjungan ~ usia + penyakit_kronis + asuransi + bmi,
data = data_kunjungan, family = poisson(link = "log"))
summary(model_poisson)##
## Call:
## glm(formula = kunjungan ~ usia + penyakit_kronis + asuransi +
## bmi, family = poisson(link = "log"), data = data_kunjungan)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.4866482 0.0985163 4.940 7.82e-07 ***
## usia 0.0147613 0.0009479 15.572 < 2e-16 ***
## penyakit_kronis 0.8073711 0.0300739 26.846 < 2e-16 ***
## asuransi 0.3772653 0.0318780 11.835 < 2e-16 ***
## bmi 0.0307966 0.0032771 9.398 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1531.61 on 349 degrees of freedom
## Residual deviance: 349.54 on 345 degrees of freedom
## AIC: 1833.7
##
## Number of Fisher Scoring iterations: 4
tidy(model_poisson) %>%
mutate(across(where(is.numeric), ~round(.x, 4)),
signif = case_when(p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.1 ~ ".",
TRUE ~ "")) %>%
kable(caption = "Hasil Estimasi Parameter Regresi Poisson") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| term | estimate | std.error | statistic | p.value | signif |
|---|---|---|---|---|---|
| (Intercept) | 0.4866 | 0.0985 | 4.9398 | 0 | *** |
| usia | 0.0148 | 0.0009 | 15.5720 | 0 | *** |
| penyakit_kronis | 0.8074 | 0.0301 | 26.8463 | 0 | *** |
| asuransi | 0.3773 | 0.0319 | 11.8347 | 0 | *** |
| bmi | 0.0308 | 0.0033 | 9.3976 | 0 | *** |
# Incidence Rate Ratio = exp(koefisien)
irr <- exp(coef(model_poisson))
ci <- exp(confint(model_poisson))
data.frame(
IRR = round(irr, 4),
CI_Lower = round(ci[, 1], 4),
CI_Upper = round(ci[, 2], 4)
) %>%
kable(caption = "Incidence Rate Ratio (IRR) dengan 95% CI") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| IRR | CI_Lower | CI_Upper | |
|---|---|---|---|
| (Intercept) | 1.6269 | 1.3408 | 1.9728 |
| usia | 1.0149 | 1.0130 | 1.0168 |
| penyakit_kronis | 2.2420 | 2.1137 | 2.3782 |
| asuransi | 1.4583 | 1.3703 | 1.5527 |
| bmi | 1.0313 | 1.0247 | 1.0379 |
Interpretasi IRR:
- Usia: IRR > 1 → setiap pertambahan 1 tahun usia, rata-rata kunjungan meningkat sebesar faktor IRR.
- Penyakit Kronis: Pasien dengan penyakit kronis memiliki rata-rata kunjungan jauh lebih tinggi dibanding yang tidak.
- Asuransi: Memiliki asuransi meningkatkan rata-rata kunjungan (akses lebih mudah).
## === Uji Dispersi ===
## Deviance : 349.539
## Df Residual: 345
## Rasio Disp : 1.013
if (model_poisson$deviance / model_poisson$df.residual > 1.5) {
cat("⚠️ Rasio > 1.5: Indikasi OVERDISPERSI → Pertimbangkan Negative Binomial Regression\n")
} else {
cat("✅ Rasio ≈ 1: Asumsi equidispersi terpenuhi\n")
}## ✅ Rasio ≈ 1: Asumsi equidispersi terpenuhi
data_kunjungan$fitted <- fitted(model_poisson)
ggplot(data_kunjungan, aes(x = fitted, y = kunjungan)) +
geom_point(alpha = 0.4, color = "#5C6BC0") +
geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed", size = 1) +
labs(title = "Nilai Aktual vs Fitted — Regresi Poisson",
x = "Nilai Fitted (Prediksi)", y = "Kunjungan Aktual") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))ringkasan <- data.frame(
Model = c("Regresi Multinomial", "Regresi Ordinal", "Regresi Poisson"),
`Variabel Dependen` = c("Kategorik Nominal (≥3)", "Kategorik Ordinal", "Count Data (cacahan)"),
`Package / Fungsi` = c("nnet::multinom()", "MASS::polr()", "glm(..., family=poisson)"),
`Link Function` = c("Softmax / Log-odds", "Logit / Probit", "Log"),
`Ukuran Efek` = c("Odds Ratio (OR)", "Odds Ratio (OR)", "Incidence Rate Ratio (IRR)"),
`Studi Kasus` = c("Pilihan Transportasi", "Kepuasan Pasien", "Kunjungan Dokter")
)
ringkasan %>%
kable(caption = "Perbandingan Ketiga Model Regresi") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE)| Model | Variabel.Dependen | Package…Fungsi | Link.Function | Ukuran.Efek | Studi.Kasus |
|---|---|---|---|---|---|
| Regresi Multinomial | Kategorik Nominal (≥3) | nnet::multinom() | Softmax / Log-odds | Odds Ratio (OR) | Pilihan Transportasi |
| Regresi Ordinal | Kategorik Ordinal | MASS::polr() | Logit / Probit | Odds Ratio (OR) | Kepuasan Pasien |
| Regresi Poisson | Count Data (cacahan) | glm(…, family=poisson) | Log | Incidence Rate Ratio (IRR) | Kunjungan Dokter |
Regresi Multinomial cocok untuk variabel dependen kategorik tanpa urutan dengan lebih dari dua pilihan. Koefisien diinterpretasikan sebagai log-odds relatif terhadap kategori referensi.
Regresi Ordinal sesuai untuk variabel dependen kategorik berurutan. Model mengasumsikan proportional odds — setiap prediktor memiliki pengaruh yang sama di semua batas kategori.
Regresi Poisson digunakan untuk data cacahan. Perlu diperhatikan asumsi equidispersi (mean = variansi); jika dilanggar, gunakan Negative Binomial Regression.
Dokumen ini dibuat menggunakan R Markdown dan dipublikasikan di RPubs.