1 Pendahuluan

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

2 Package yang Digunakan

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

3 Regresi Multinomial

3.1 Deskripsi

Regresi 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: transportasiMotor, Angkot, Ojek Online

3.2 Data

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)
10 Baris Pertama Data Transportasi
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
cat("Dimensi Data:", nrow(data_transport), "baris x", ncol(data_transport), "kolom\n\n")
## Dimensi Data: 300 baris x 4 kolom
cat("Distribusi Variabel Dependen:\n")
## 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)
Distribusi Pilihan Transportasi
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))

3.3 Pemodelan

# 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)
Hasil Estimasi Parameter Regresi Multinomial
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

3.4 Odds Ratio & Interpretasi

# 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)
Odds Ratio Regresi Multinomial
(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)
Confusion Matrix Regresi Multinomial
Motor Angkot Ojek Online
Motor 129 30 56
Angkot 0 0 0
Ojek Online 29 10 46

4 Regresi Ordinal

4.1 Deskripsi

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: kepuasanTidak Puas < Cukup Puas < Puas < Sangat Puas

4.2 Data

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)
10 Baris Pertama Data Kepuasan Pasien
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)
Distribusi Tingkat Kepuasan Pasien
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))

4.3 Pemodelan

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)
Hasil Estimasi Parameter Regresi Ordinal
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&#124;Cukup Puas -2.4685 0.5602 -4.4067 0.0000
Cukup Puas&#124;Puas -0.1113 0.5249 -0.2121 0.8321
Puas&#124;Sangat Puas 2.4289 0.5635 4.3103 0.0000

4.4 Odds Ratio & Interpretasi

# 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 Regresi Ordinal
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))


5 Regresi Poisson

5.1 Deskripsi

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 Tubuh

5.2 Data

set.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)
10 Baris Pertama Data Kunjungan Dokter
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
cat("Statistik Variabel Kunjungan:\n")
## Statistik Variabel Kunjungan:
summary(data_kunjungan$kunjungan)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    7.00   10.50   12.69   16.75   48.00
cat("\nMean  :", round(mean(data_kunjungan$kunjungan), 3))
## 
## Mean  : 12.694
cat("\nVarians:", round(var(data_kunjungan$kunjungan), 3), "\n")
## 
## 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))

5.3 Pemodelan

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)
Hasil Estimasi Parameter Regresi Poisson
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 ***

5.4 Incidence Rate Ratio & Uji Asumsi

# 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)
Incidence Rate Ratio (IRR) dengan 95% CI
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 Goodness of Fit (Overdispersion check)
cat("=== Uji Dispersi ===\n")
## === Uji Dispersi ===
cat("Deviance   :", round(model_poisson$deviance, 3), "\n")
## Deviance   : 349.539
cat("Df Residual:", model_poisson$df.residual, "\n")
## Df Residual: 345
cat("Rasio Disp :", round(model_poisson$deviance / model_poisson$df.residual, 3), "\n\n")
## 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))


6 Perbandingan Ketiga Model

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)
Perbandingan Ketiga Model Regresi
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

7 Kesimpulan

  1. Regresi Multinomial cocok untuk variabel dependen kategorik tanpa urutan dengan lebih dari dua pilihan. Koefisien diinterpretasikan sebagai log-odds relatif terhadap kategori referensi.

  2. Regresi Ordinal sesuai untuk variabel dependen kategorik berurutan. Model mengasumsikan proportional odds — setiap prediktor memiliki pengaruh yang sama di semua batas kategori.

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