Buku elektronik (ebook) ini disusun sebagai materi pendamping mata kuliah Statistika Terapan, khususnya pada topik analisis data kategori. Data kategori muncul hampir di setiap bidang: kesehatan (sembuh/tidak sembuh), pendidikan (lulus tepat waktu/tidak), pemasaran (memilih produk A, B, atau C), maupun survei kepuasan (rendah, sedang, tinggi). Ketika variabel respons semacam ini dianalisis dengan regresi linear biasa (Ordinary Least Squares/OLS), sejumlah asumsi penting dilanggar, sehingga diperlukan keluarga model yang lebih sesuai, yaitu generalized linear model (GLM).
Ebook ini membahas empat model utama secara berurutan, mulai dari yang paling sederhana hingga yang lebih kompleks:
Setiap bab disusun dengan pola yang konsisten: definisi dan motivasi, formulasi matematis, estimasi parameter, interpretasi koefisien, implementasi di R lengkap dengan contoh soal, serta pemeriksaan asumsi model. Seluruh kode R dalam ebook ini menggunakan data simulasi yang dibuat langsung di dalam chunk, sehingga pembaca dapat langsung menjalankan (knit) dokumen ini tanpa perlu mengunduh data eksternal.
Sebelum memilih model, langkah pertama yang harus dilakukan seorang analis adalah mengidentifikasi skala pengukuran variabel respons (Y). Kesalahan paling umum dalam analisis data kategori adalah memaksakan regresi linear (OLS) pada respons yang sebetulnya bersifat kategorik atau diskret.
| Jenis Respons | Contoh | Model yang Sesuai |
|---|---|---|
| Biner (2 kategori) | lulus/tidak lulus, membeli/tidak membeli | Regresi logistik biner |
| Nominal (>2 kategori, tanpa urutan) | moda transportasi: motor, mobil, angkot | Regresi logistik multinomial |
| Ordinal (>2 kategori, berurutan) | kepuasan: rendah, sedang, tinggi | Regresi logistik ordinal |
| Hitungan (count, non-negatif) | jumlah kunjungan, jumlah komplain | Regresi Poisson |
Setiap baris pada tabel di atas layak diuraikan lebih jauh agar pembaca terbiasa mengenali polanya di lapangan. Pada kasus respons biner, peneliti biasanya tertarik pada satu peristiwa yang jelas batasan “terjadi” atau “tidak terjadi”-nya, misalnya kelulusan, kematian, gagal bayar, atau keberhasilan suatu intervensi. Pada kasus respons nominal, kategori-kategori yang ada bersifat setara secara konseptual tanpa ada satu kategori yang secara alami “lebih tinggi” dari kategori lain — memilih moda transportasi tidak sama dengan menaiki “tangga” tertentu. Sebaliknya, pada respons ordinal, kategori-kategori tersebut membentuk suatu kontinum tersembunyi (latent continuum) yang diskritisasi menjadi beberapa level, seperti tingkat kepuasan yang pada dasarnya adalah konstruk kontinu namun diukur dalam skala kategori karena keterbatasan instrumen pengukuran. Terakhir, respons hitungan selalu berupa bilangan bulat non-negatif yang menghitung frekuensi suatu kejadian dalam interval tertentu, dan besarnya interval tersebut (exposure) menjadi informasi penting yang sering kali luput diperhitungkan oleh peneliti pemula.
Mengenali pola-pola ini sejak tahap perumusan masalah penelitian akan sangat menghemat waktu analisis, karena kesalahan pemilihan model di awal biasanya baru disadari setelah pemeriksaan asumsi dilakukan — sebuah tahap yang idealnya dilakukan lebih awal, bukan sebagai pemeriksaan akhir semata.
Jika Y biner dikodekan 0/1 lalu diregresikan secara linear terhadap X (model linear probability model), setidaknya muncul tiga masalah:
Untuk data hitung, masalah serupa muncul: OLS dapat menghasilkan prediksi negatif padahal jumlah kejadian tidak mungkin negatif, dan varians data hitung umumnya meningkat seiring meningkatnya rata-rata (tidak homoskedastis).
Keempat model dalam ebook ini adalah anggota keluarga GLM, yang memiliki tiga komponen:
Pemahaman terhadap kerangka ini memudahkan kita melihat bahwa keempat model bukanlah topik yang terpisah-pisah, melainkan variasi dari satu ide besar yang sama.
Gagasan menghubungkan peluang kejadian dengan fungsi logit pertama kali dikembangkan secara sistematis oleh Joseph Berkson pada tahun 1944 dalam konteks bioassay, sebagai alternatif terhadap model probit yang sudah lebih dulu digunakan. Model logistik multinomial kemudian dikembangkan lebih lanjut, salah satunya oleh Daniel McFadden, yang memperkenalkan kerangka random utility model sebagai dasar teoretis dari pilihan diskret (discrete choice) — kontribusi yang mengantarkannya meraih Hadiah Nobel Ekonomi pada tahun 2000. Model logistik ordinal dengan pendekatan cumulative logit dipopulerkan oleh Peter McCullagh pada awal 1980-an, sedangkan regresi Poisson untuk data hitung memiliki akar yang lebih tua, merujuk pada karya Siméon Denis Poisson di bidang teori peluang pada abad ke-19, namun baru dirumuskan sebagai bagian dari kerangka generalized linear model oleh John Nelder dan Robert Wedderburn pada tahun 1972. Kerangka GLM inilah yang menyatukan keempat model dalam ebook ini sebagai satu keluarga besar yang berbagi struktur matematis serupa, hanya berbeda pada distribusi komponen acak dan fungsi penghubung yang digunakan.
Perkembangan komputasi statistik modern, khususnya perangkat lunak R, SAS, Stata, dan SPSS, membuat estimasi keempat model ini menjadi sangat mudah dilakukan meskipun perhitungan di baliknya melibatkan optimasi numerik yang kompleks. Meskipun demikian, kemudahan komputasi ini menuntut pengguna untuk semakin memahami asumsi dan interpretasi model secara benar, karena kesalahan interpretasi jauh lebih sering terjadi dibandingkan kesalahan komputasi itu sendiri.
Sebelum masuk ke formulasi matematis masing-masing model pada bab-bab berikutnya, ada baiknya membangun intuisi terlebih dahulu mengenai pertanyaan dasar yang dijawab oleh setiap model:
Empat sudut pandang inilah yang membedakan bentuk matematis dan cara membaca output dari keempat model, meskipun secara komputasi keempatnya sama-sama diestimasi melalui prinsip maximum likelihood di dalam kerangka generalized linear model.
Regresi logistik biner digunakan ketika variabel respons \(Y\) hanya memiliki dua kemungkinan nilai, biasanya dikodekan sebagai \(Y=1\) (kejadian terjadi/“sukses”) dan \(Y=0\) (kejadian tidak terjadi/“gagal”). Tujuannya adalah memodelkan peluang \(P(Y=1 \mid X)\) sebagai fungsi dari satu atau lebih variabel prediktor.
Contoh kasus: memprediksi apakah seorang nasabah akan menunggak kredit (1) atau tidak menunggak (0) berdasarkan lama bekerja dan jumlah pinjaman.
Misalkan \(p(x) = P(Y=1 \mid X=x)\). Model regresi logistik biner menghubungkan \(p(x)\) dengan prediktor melalui fungsi logit:
\[ \text{logit}\big(p(x)\big) = \ln\left(\frac{p(x)}{1-p(x)}\right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_p x_p \]
Dari sini, peluang \(p(x)\) dapat diperoleh kembali melalui transformasi balik (fungsi logistik):
\[ p(x) = \frac{\exp(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p)} {1 + \exp(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p)} \]
Fungsi ini menghasilkan kurva berbentuk S (sigmoid) yang nilainya selalu berada di antara 0 dan 1, sehingga secara otomatis mengatasi masalah linear probability model yang telah dibahas sebelumnya.
Parameter \(\beta\) diestimasi menggunakan metode kemungkinan maksimum (maximum likelihood estimation/MLE), bukan least squares. Fungsi likelihood untuk \(n\) observasi independen adalah:
\[ L(\beta) = \prod_{i=1}^{n} p(x_i)^{y_i} \big(1-p(x_i)\big)^{1-y_i} \]
Nilai \(\beta\) yang dipilih adalah
yang memaksimumkan log-likelihood \(\ell(\beta) = \ln L(\beta)\). Karena tidak
ada solusi tertutup (closed form), estimasi dilakukan secara numerik
melalui algoritme iteratif seperti Iteratively Reweighted Least
Squares (IRLS), yang secara otomatis dijalankan oleh fungsi
glm() di R.
Koefisien \(\beta_1\) pada model logit tidak diinterpretasikan secara langsung seperti pada regresi linear. Interpretasi yang lazim digunakan adalah melalui odds ratio (OR):
\[ \text{OR} = e^{\beta_1} \]
Selain melihat signifikansi masing-masing koefisien, seorang analis juga perlu menilai kesesuaian model secara keseluruhan (overall fit). Salah satu ukuran yang umum digunakan pada model GLM adalah deviance, yang didefinisikan sebagai:
\[ G^2 = -2\big[\ell(\hat\beta) - \ell(\text{saturated})\big] \]
dengan \(\ell(\hat\beta)\) adalah
log-likelihood model yang diestimasi dan \(\ell(\text{saturated})\) adalah
log-likelihood model saturated (model dengan parameter sebanyak jumlah
observasi, yang berarti cocok sempurna dengan data). Nilai deviance yang
kecil menunjukkan model cocok dengan data secara baik. Pada R, nilai ini
tersedia langsung melalui komponen model_biner$deviance,
dan dapat dibandingkan dengan model_biner$null.deviance
(deviance model tanpa prediktor sama sekali) untuk menilai seberapa
besar kontribusi prediktor secara keseluruhan:
## Null deviance: 415.87 pada df = 299
cat("Residual deviance:", round(model_biner$deviance, 2),
"pada df =", model_biner$df.residual, "\n")## Residual deviance: 364.96 pada df = 297
# Uji likelihood ratio (chi-square) untuk model secara keseluruhan
selisih_deviance <- model_biner$null.deviance - model_biner$deviance
df_selisih <- model_biner$df.null - model_biner$df.residual
p_value_model <- pchisq(selisih_deviance, df = df_selisih, lower.tail = FALSE)
cat("Chi-square:", round(selisih_deviance, 2), "| df:", df_selisih,
"| p-value:", format.pval(p_value_model, digits = 4))## Chi-square: 50.92 | df: 2 | p-value: 8.77e-12
Nilai p-value yang kecil (< 0,05) pada uji ini menunjukkan bahwa setidaknya satu prediktor dalam model berkontribusi signifikan terhadap peluang kejadian, dibandingkan model yang hanya berisi intersep.
data_kredit$prob_pred <- predict(model_biner, type = "response")
data_kredit$kelas_pred <- factor(
ifelse(data_kredit$prob_pred > 0.5, "Ya", "Tidak"),
levels = c("Tidak", "Ya")
)
tabel_confusion <- table(
Aktual = data_kredit$menunggak,
Prediksi = data_kredit$kelas_pred
)
tabel_confusion## Prediksi
## Aktual Tidak Ya
## Tidak 102 49
## Ya 52 97
akurasi <- sum(diag(tabel_confusion)) / sum(tabel_confusion)
cat("Akurasi model:", round(akurasi, 3))## Akurasi model: 0.663
ggplot(data_kredit, aes(x = rasio_cicilan, y = prob_pred)) +
geom_point(aes(color = menunggak), alpha = 0.5) +
geom_smooth(method = "glm", method.args = list(family = "binomial"),
se = TRUE, color = "black") +
labs(title = "Kurva Peluang Menunggak vs Rasio Cicilan",
x = "Rasio Cicilan terhadap Pendapatan (%)",
y = "Peluang Prediksi Menunggak") +
theme_minimal()Beberapa asumsi yang perlu diperiksa:
summary().## lama_kerja rasio_cicilan
## 1.070155 1.070155
Nilai VIF yang mendekati 1 menunjukkan tidak ada indikasi
multikolinearitas serius antara lama_kerja dan
rasio_cicilan. Sebagai pedoman umum, nilai VIF di atas 10
(atau pada beberapa sumber, di atas 5) mengindikasikan multikolinearitas
yang perlu ditangani, misalnya dengan mengeluarkan salah satu prediktor
yang berkorelasi tinggi atau menggunakan teknik regularisasi seperti
ridge regression.
Agar pemahaman konsep odds dan odds ratio lebih konkret, perhatikan ilustrasi sederhana berikut. Misalkan pada suatu subkelompok nasabah, peluang menunggak adalah \(p = 0{,}2\). Odds kejadian tersebut dihitung sebagai:
\[ \text{odds} = \frac{p}{1-p} = \frac{0{,}2}{0{,}8} = 0{,}25 \]
Odds sebesar 0,25 berarti peluang tidak menunggak empat kali lebih besar dibandingkan peluang menunggak. Jika model memprediksi odds ratio sebesar 1,5 untuk kenaikan satu satuan rasio cicilan, maka odds baru menjadi \(0{,}25 \times 1{,}5 = 0{,}375\), yang jika dikonversi kembali ke peluang menghasilkan \(p' = 0{,}375 / (1+0{,}375) \approx 0{,}273\). Contoh ini menegaskan bahwa odds ratio mengalikan odds, bukan menambah probabilitas secara langsung — kesalahan interpretasi yang paling sering terjadi pada pemula.
Untuk memperdalam pemahaman, kerjakan latihan berikut menggunakan
data data_kredit yang telah dibuat pada bab ini, atau
dengan data Anda sendiri.
usia nasabah,
ke dalam model_biner. Apakah odds ratio untuk
lama_kerja berubah secara substansial setelah
usia dikontrol? Jelaskan kemungkinan penyebabnya (petunjuk:
periksa korelasi antara usia dan
lama_kerja).kelas_pred. Bagaimana perubahan
tersebut memengaruhi nilai sensitivity dan specificity
model?model_biner
menggunakan rumus \(R^2_{McFadden} = 1 -
\dfrac{\ell(\hat\beta)}{\ell(\beta_0)}\), dengan \(\ell(\hat\beta)\) adalah log-likelihood
model penuh dan \(\ell(\beta_0)\)
adalah log-likelihood model tanpa prediktor (model null).
Bandingkan interpretasinya dengan \(R^2\) pada regresi linear.model_biner menggunakan paket
pROC. Apa makna nilai AUC sebesar 0,85 dalam konteks
kemampuan diskriminasi model?Regresi logistik biner adalah model dasar untuk respons dua kategori, menggunakan fungsi penghubung logit untuk memastikan prediksi peluang selalu berada pada rentang \([0,1]\). Parameter diestimasi melalui maximum likelihood, dan interpretasi koefisien dilakukan melalui odds ratio. Sebelum menyimpulkan hasil, analis wajib memeriksa linearitas logit, multikolinearitas, ukuran sampel, dan indikasi separasi sempurna pada data.
Regresi logistik multinomial merupakan perluasan dari regresi logistik biner untuk kasus di mana variabel respons memiliki lebih dari dua kategori yang tidak berurutan (nominal). Pertanyaan yang dijawab model ini adalah: “Dibandingkan dengan kategori referensi, bagaimana peluang seseorang berada pada kategori tertentu berubah ketika prediktor berubah?”
Contoh kasus: memilih moda transportasi utama ke kampus — motor, mobil pribadi, atau angkutan umum.
Misalkan respons \(Y\) memiliki \(J\) kategori \(\{1, 2, \dots, J\}\), dan kategori \(J\) dipilih sebagai kategori referensi (baseline). Model membentuk \(J-1\) persamaan logit simultan, masing-masing membandingkan kategori \(j\) terhadap kategori referensi:
\[ \ln\left(\frac{P(Y=j \mid x)}{P(Y=J \mid x)}\right) = \beta_{0j} + \beta_{1j} x_1 + \dots + \beta_{pj} x_p, \quad j = 1, \dots, J-1 \]
Peluang masing-masing kategori diperoleh melalui:
\[ P(Y=j \mid x) = \frac{\exp(\eta_j)}{1 + \sum_{k=1}^{J-1} \exp(\eta_k)}, \qquad P(Y=J \mid x) = \frac{1}{1 + \sum_{k=1}^{J-1} \exp(\eta_k)} \]
dengan \(\eta_j = \beta_{0j} + \beta_{1j}x_1 + \dots + \beta_{pj}x_p\).
Sama seperti model biner, parameter diestimasi melalui maximum likelihood, namun sekarang likelihood dibentuk dari distribusi multinomial. Fungsi likelihood untuk \(n\) observasi independen dengan \(J\) kategori dapat dituliskan sebagai:
\[ L(\beta) = \prod_{i=1}^{n} \prod_{j=1}^{J} \big[P(Y_i = j \mid x_i)\big]^{I(y_i = j)} \]
dengan \(I(y_i = j)\) adalah fungsi
indikator yang bernilai 1 jika observasi ke-\(i\) berada pada kategori \(j\), dan 0 sebaliknya. Karena tidak ada
solusi analitik tertutup untuk memaksimumkan log-likelihood dari fungsi
ini, estimasi dilakukan secara numerik menggunakan algoritme iteratif.
Implementasi multinom() pada paket nnet
menggunakan pendekatan jaringan saraf tiruan berlapis tunggal tanpa
hidden layer (single-layer neural network) yang secara
matematis ekuivalen dengan regresi logistik multinomial standar, dengan
optimasi melalui algoritme quasi-Newton (BFGS). Pendekatan ini
dipilih karena stabil secara komputasi bahkan untuk kategori respons
yang cukup banyak dan ukuran data yang besar.
Setiap koefisien \(\beta_{kj}\) diinterpretasikan sebagai perubahan log-odds kategori \(j\) relatif terhadap kategori referensi \(J\) untuk setiap kenaikan satu satuan \(X_k\). Dalam bentuk odds ratio, \(e^{\beta_{kj}}\) menyatakan kelipatan perubahan odds memilih kategori \(j\) dibanding kategori referensi.
Poin penting: koefisien model multinomial spesifik terhadap pasangan kategori (kategori \(j\) vs kategori referensi), bukan efek tunggal seperti pada model biner.
Soal. Sebuah survei terhadap 400 mahasiswa mengumpulkan data jarak tempuh ke kampus (km) dan pendapatan keluarga per bulan (juta rupiah) untuk memprediksi pilihan moda transportasi (Angkutan Umum sebagai kategori referensi, dibandingkan Motor dan Mobil).
n <- 400
jarak <- round(rgamma(n, shape = 2, scale = 3), 1)
pendapatan <- round(rnorm(n, mean = 6, sd = 2.5), 1)
pendapatan[pendapatan < 1] <- 1
skor_motor <- 0.9 + 0.15 * jarak - 0.05 * pendapatan
skor_mobil <- -1.5 - 0.05 * jarak + 0.55 * pendapatan
skor_umum <- 0 # kategori referensi
expo <- cbind(exp(skor_umum), exp(skor_motor), exp(skor_mobil))
prob <- expo / rowSums(expo)
moda <- apply(prob, 1, function(p) sample(c("Angkutan_Umum", "Motor", "Mobil"),
size = 1, prob = p))
data_moda <- tibble(
moda = factor(moda, levels = c("Angkutan_Umum", "Motor", "Mobil")),
jarak = jarak,
pendapatan = pendapatan
)
table(data_moda$moda)##
## Angkutan_Umum Motor Mobil
## 23 188 189
ggplot(data_moda, aes(x = moda, fill = moda)) +
geom_bar() +
labs(title = "Distribusi Pilihan Moda Transportasi",
x = "Moda Transportasi", y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none")data_moda$moda <- relevel(data_moda$moda, ref = "Angkutan_Umum")
model_multinom <- multinom(moda ~ jarak + pendapatan, data = data_moda, trace = FALSE)
summary(model_multinom)## Call:
## multinom(formula = moda ~ jarak + pendapatan, data = data_moda,
## trace = FALSE)
##
## Coefficients:
## (Intercept) jarak pendapatan
## Motor 1.6357291 0.14264316 -0.07723006
## Mobil -0.9589199 -0.07977549 0.55778073
##
## Std. Errors:
## (Intercept) jarak pendapatan
## Motor 0.6589018 0.06441424 0.1110508
## Mobil 0.7283329 0.06872226 0.1187733
##
## Residual Deviance: 535.3235
## AIC: 547.3235
Karena multinom() tidak secara otomatis menampilkan
p-value, kita menghitungnya secara manual:
z_value <- summary(model_multinom)$coefficients / summary(model_multinom)$standard.errors
p_value <- (1 - pnorm(abs(z_value), 0, 1)) * 2
round(p_value, 4)## (Intercept) jarak pendapatan
## Motor 0.013 0.0268 0.4868
## Mobil 0.188 0.2457 0.0000
## (Intercept) jarak pendapatan
## Motor 5.1331992 1.1533182 0.9256769
## Mobil 0.3833067 0.9233236 1.7467916
Misalnya, jika koefisien jarak pada persamaan Motor
bernilai positif, maka setiap kenaikan 1 km jarak tempuh meningkatkan
odds memilih Motor dibanding Angkutan Umum sebesar \(e^{\beta}\) kali, dengan pendapatan
dikontrol konstan.
data_moda$pred_kelas <- predict(model_multinom, type = "class")
tabel_confusion_multi <- table(Aktual = data_moda$moda, Prediksi = data_moda$pred_kelas)
tabel_confusion_multi## Prediksi
## Aktual Angkutan_Umum Motor Mobil
## Angkutan_Umum 0 11 12
## Motor 0 140 48
## Mobil 0 47 142
akurasi_multi <- sum(diag(tabel_confusion_multi)) / sum(tabel_confusion_multi)
cat("Akurasi model multinomial:", round(akurasi_multi, 3))## Akurasi model multinomial: 0.705
prob_pred_multi <- predict(model_multinom, type = "probs")
data_plot_multi <- bind_cols(data_moda, as_tibble(prob_pred_multi)) %>%
pivot_longer(cols = c("Angkutan_Umum", "Motor", "Mobil"),
names_to = "kategori", values_to = "probabilitas")
ggplot(data_plot_multi, aes(x = jarak, y = probabilitas, color = kategori)) +
geom_smooth(method = "loess", se = FALSE) +
labs(title = "Probabilitas Prediksi Moda Transportasi vs Jarak",
x = "Jarak Tempuh (km)", y = "Probabilitas Prediksi") +
theme_minimal()Grafik ini memperlihatkan bagaimana probabilitas ketiga kategori bergerak saling melengkapi (selalu berjumlah 1) seiring perubahan jarak tempuh — ciri khas visualisasi model multinomial.
Pola yang tampak pada grafik di atas umumnya berbentuk beberapa kurva yang saling bersilangan (crossing curves): pada nilai jarak tempuh kecil, satu kategori mendominasi probabilitas prediksi, namun seiring bertambahnya jarak, dominasi tersebut berpindah ke kategori lain. Pola persilangan ini adalah representasi visual langsung dari sifat kompetitif antarkategori pada model multinomial — peningkatan probabilitas satu kategori harus dikompensasi oleh penurunan probabilitas kategori lainnya, karena totalnya selalu tetap 1 untuk setiap nilai prediktor. Ketika membaca grafik semacam ini, fokus utama sebaiknya diarahkan pada titik potong (crossover point) antarkurva, karena titik tersebut menunjukkan nilai prediktor di mana preferensi kategori “berpindah tangan” — informasi yang sangat berguna dalam konteks pengambilan kebijakan, misalnya menentukan pada jarak berapa subsidi transportasi publik paling efektif menggeser preferensi dari kendaraan pribadi.
Jika asumsi IIA dilanggar — misalnya karena dua kategori sangat mirip satu sama lain (contoh klasik: “bus merah” vs “bus biru”) — model multinomial dapat menghasilkan estimasi yang bias. Solusi alternatif mencakup nested logit model atau mixed/random parameter logit.
Pemilihan kategori referensi bersifat bebas secara matematis — model akan menghasilkan nilai fitted probabilities yang identik apa pun kategori referensinya — namun berpengaruh besar terhadap kemudahan interpretasi hasil. Sebagai pedoman praktis, pilihlah kategori referensi yang:
Pada contoh moda transportasi, “Angkutan Umum” dipilih sebagai referensi karena mencerminkan moda yang paling umum dan tidak memerlukan kepemilikan kendaraan pribadi, sehingga perbandingan terhadap Motor dan Mobil menjadi lebih bermakna secara kebijakan (misalnya untuk menyusun kebijakan subsidi transportasi publik).
data_moda dari
“Angkutan_Umum” menjadi “Motor” menggunakan relevel(), lalu
estimasi ulang modelnya. Bandingkan tanda dan besar koefisien
pendapatan dengan model sebelumnya — apakah kesimpulan
substantif berubah?kepemilikan_sim (punya SIM/tidak), ke dalam model.
Interpretasikan odds ratio-nya untuk masing-masing kategori (Motor vs
referensi, Mobil vs referensi).jarak dan pendapatan)
dengan model tereduksi (hanya jarak) menggunakan
anova(model_reduksi, model_penuh, test = "Chisq") pada
objek yang sesuai. Apa kesimpulan Anda mengenai kontribusi
pendapatan terhadap model?Regresi logistik multinomial memperluas model biner untuk respons nominal dengan lebih dari dua kategori, dengan membentuk \(J-1\) persamaan logit terhadap kategori referensi. Interpretasi koefisien bersifat spesifik per pasangan kategori, dan asumsi IIA menjadi pertimbangan penting yang membedakan model ini dari model ordinal maupun model pilihan diskret lainnya.
Regresi logistik ordinal digunakan ketika kategori respons memiliki urutan alami, misalnya tingkat kepuasan (rendah < sedang < tinggi < sangat tinggi) atau tingkat pendidikan. Berbeda dengan model multinomial yang mengabaikan urutan, model ordinal memanfaatkan informasi urutan tersebut sehingga umumnya lebih hemat parameter (parsimonious).
Pendekatan paling umum adalah cumulative logit model (juga dikenal sebagai proportional odds model). Misalkan \(Y\) memiliki \(J\) kategori terurut \(1 < 2 < \dots < J\). Model memodelkan peluang kumulatif:
\[ \text{logit}\big[P(Y \le j \mid x)\big] = \ln\left(\frac{P(Y \le j \mid x)}{P(Y > j \mid x)}\right) = \alpha_j - \big(\beta_1 x_1 + \dots + \beta_p x_p\big), \quad j = 1, \dots, J-1 \]
Terdapat \(J-1\) intersep (\(\alpha_j\), disebut cutpoints atau thresholds) yang meningkat monoton (\(\alpha_1 < \alpha_2 < \dots < \alpha_{J-1}\)), namun koefisien kemiringan \(\beta\) bersifat sama untuk semua cutpoint — inilah inti dari asumsi proportional odds.
Karena bentuk parameterisasi dapat berbeda antarpaket (ada yang
menggunakan \(+\beta x\), ada yang
\(-\beta x\)), tanda koefisien harus
dibaca hati-hati sesuai konvensi paket yang digunakan. Pada fungsi
polr() di paket MASS yang digunakan dalam
ebook ini, model diparameterisasi sebagai:
\[ \text{logit}\big[P(Y \le j \mid x)\big] = \alpha_j - \eta(x), \qquad \eta(x) = \beta_1 x_1 + \dots + \beta_p x_p \]
sehingga koefisien positif berarti prediktor tersebut cenderung mendorong observasi menuju kategori respons yang lebih tinggi (odds kumulatif \(P(Y \le j)\) menurun, artinya odds berada pada kategori lebih tinggi meningkat). Interpretasi odds ratio dilakukan dengan \(e^{\beta}\): kelipatan perubahan odds berada pada kategori \(Y\) yang lebih tinggi (dibanding kategori yang lebih rendah atau sama) untuk setiap kenaikan satu satuan prediktor.
Sama seperti model sebelumnya, parameter \((\alpha_j, \beta)\) diestimasi melalui maximum likelihood, dengan probabilitas setiap kategori dihitung sebagai selisih dua peluang kumulatif:
\[ P(Y = j \mid x) = P(Y \le j \mid x) - P(Y \le j-1 \mid x) \]
Soal. Sebuah perusahaan e-commerce ingin mengetahui pengaruh waktu pengiriman (hari) dan skor layanan pelanggan (0-10) terhadap tingkat kepuasan (Rendah, Sedang, Tinggi, Sangat Tinggi) dari 350 responden.
n <- 350
waktu_kirim <- round(rgamma(n, shape = 3, scale = 1.3), 1)
skor_layanan <- round(runif(n, min = 0, max = 10), 1)
eta <- -0.35 * waktu_kirim + 0.45 * skor_layanan
cutpoints <- c(-1, 1.5, 4) # tiga cutpoint untuk 4 kategori
prob_kum <- sapply(cutpoints, function(a) plogis(a - eta))
prob_kategori <- cbind(prob_kum, 1) - cbind(0, prob_kum)
colnames(prob_kategori) <- c("Rendah", "Sedang", "Tinggi", "Sangat_Tinggi")
kepuasan <- apply(prob_kategori, 1, function(p) sample(
c("Rendah", "Sedang", "Tinggi", "Sangat_Tinggi"), size = 1, prob = p))
data_kepuasan <- tibble(
kepuasan = factor(kepuasan,
levels = c("Rendah", "Sedang", "Tinggi", "Sangat_Tinggi"),
ordered = TRUE),
waktu_kirim = waktu_kirim,
skor_layanan = skor_layanan
)
table(data_kepuasan$kepuasan)##
## Rendah Sedang Tinggi Sangat_Tinggi
## 74 142 110 24
ggplot(data_kepuasan, aes(x = kepuasan, fill = kepuasan)) +
geom_bar() +
labs(title = "Distribusi Tingkat Kepuasan Pelanggan",
x = "Tingkat Kepuasan", y = "Frekuensi") +
theme_minimal() + theme(legend.position = "none")model_ordinal <- polr(
kepuasan ~ waktu_kirim + skor_layanan,
data = data_kepuasan, Hess = TRUE
)
summary(model_ordinal)## Call:
## polr(formula = kepuasan ~ waktu_kirim + skor_layanan, data = data_kepuasan,
## Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## waktu_kirim -0.4106 0.05334 -7.698
## skor_layanan 0.4680 0.04468 10.475
##
## Intercepts:
## Value Std. Error t value
## Rendah|Sedang -1.3095 0.3001 -4.3638
## Sedang|Tinggi 1.2882 0.3028 4.2545
## Tinggi|Sangat_Tinggi 4.1708 0.3925 10.6262
##
## Residual Deviance: 687.8651
## AIC: 697.8651
koef_ordinal <- coef(summary(model_ordinal))
p_value_ordinal <- pnorm(abs(koef_ordinal[, "t value"]), lower.tail = FALSE) * 2
cbind(koef_ordinal, p_value = round(p_value_ordinal, 4))## Value Std. Error t value p_value
## waktu_kirim -0.4106162 0.05334043 -7.698029 0
## skor_layanan 0.4679951 0.04467879 10.474658 0
## Rendah|Sedang -1.3094834 0.30008159 -4.363758 0
## Sedang|Tinggi 1.2882413 0.30279619 4.254483 0
## Tinggi|Sangat_Tinggi 4.1707798 0.39250120 10.626158 0
## waktu_kirim skor_layanan
## 0.6632415 1.5967896
Misalnya, jika odds ratio skor_layanan bernilai lebih
dari 1, maka setiap kenaikan satu poin skor layanan pelanggan
meningkatkan odds berada pada tingkat kepuasan yang lebih tinggi
(dibanding tingkat yang lebih rendah), dengan waktu pengiriman dikontrol
konstan.
data_kepuasan$pred_kelas <- predict(model_ordinal, type = "class")
tabel_confusion_ordinal <- table(
Aktual = data_kepuasan$kepuasan, Prediksi = data_kepuasan$pred_kelas
)
tabel_confusion_ordinal## Prediksi
## Aktual Rendah Sedang Tinggi Sangat_Tinggi
## Rendah 28 39 7 0
## Sedang 15 98 29 0
## Tinggi 3 37 68 2
## Sangat_Tinggi 0 2 20 2
akurasi_ordinal <- sum(diag(tabel_confusion_ordinal)) / sum(tabel_confusion_ordinal)
cat("Akurasi model ordinal:", round(akurasi_ordinal, 3))## Akurasi model ordinal: 0.56
prob_pred_ordinal <- predict(model_ordinal, type = "probs")
data_plot_ordinal <- bind_cols(data_kepuasan, as_tibble(prob_pred_ordinal)) %>%
pivot_longer(cols = c("Rendah", "Sedang", "Tinggi", "Sangat_Tinggi"),
names_to = "kategori", values_to = "probabilitas") %>%
mutate(kategori = factor(kategori,
levels = c("Rendah", "Sedang", "Tinggi", "Sangat_Tinggi")))
ggplot(data_plot_ordinal, aes(x = skor_layanan, y = probabilitas, color = kategori)) +
geom_smooth(method = "loess", se = FALSE) +
labs(title = "Probabilitas Prediksi Tingkat Kepuasan vs Skor Layanan",
x = "Skor Layanan Pelanggan", y = "Probabilitas Prediksi") +
theme_minimal()Berbeda dari grafik multinomial yang kurvanya dapat bersilangan pada sembarang urutan, grafik probabilitas prediksi model ordinal yang baik umumnya menunjukkan pola pergeseran yang teratur dan monoton: seiring skor layanan meningkat, probabilitas kategori “Rendah” akan menurun secara konsisten, sementara probabilitas kategori “Sangat Tinggi” akan meningkat secara konsisten, dengan kategori “Sedang” dan “Tinggi” membentuk pola menyerupai bukit (naik lalu turun) di antara keduanya. Pola menyerupai bukit yang berurutan secara rapi dari kategori terendah ke kategori tertinggi ini adalah ciri visual khas dari model cumulative logit yang memenuhi asumsi proportional odds. Jika pola tersebut tampak tidak teratur — misalnya kurva kategori tengah tumpang tindih secara tidak wajar dengan kategori ekstrem — hal ini dapat menjadi indikasi awal (meski bukan bukti formal) bahwa asumsi proportional odds patut dicurigai dan perlu diuji lebih lanjut.
Asumsi utama yang perlu diperiksa pada model ordinal adalah
proportional odds (parallel lines assumption): pengaruh
prediktor terhadap odds kumulatif diasumsikan sama
besarnya pada setiap cutpoint. Salah satu cara memeriksa asumsi
ini adalah membandingkan model cumulative logit dengan model yang
mengizinkan koefisien berbeda-beda per cutpoint (misalnya melalui paket
ordinal dengan fungsi clm() dan uji
nominal test, atau uji Brant).
# Uji proportional odds secara sederhana menggunakan pendekatan Brant
# (memerlukan paket 'brant'; ditampilkan sebagai ilustrasi kode)
# brant::brant(model_ordinal)
cat("Gunakan brant::brant(model_ordinal) atau paket 'ordinal' untuk uji formal proportional odds.")## Gunakan brant::brant(model_ordinal) atau paket 'ordinal' untuk uji formal proportional odds.
Jika asumsi proportional odds dilanggar, alternatif yang dapat digunakan antara lain generalized ordinal logit model (partial proportional odds) atau kembali menggunakan model multinomial dengan mengabaikan urutan kategori.
Meskipun kategori respons pada contoh kepuasan pelanggan memiliki urutan yang jelas, seorang analis tetap perlu mempertimbangkan trade-off berikut sebelum memutuskan menggunakan model ordinal:
model_ordinal dengan menambahkan
interaksi antara waktu_kirim dan skor_layanan.
Apakah interaksi tersebut signifikan secara statistik? Bagaimana
interpretasinya jika signifikan?ordinal (fungsi clm()) untuk
mengestimasi ulang model yang sama, lalu bandingkan nilai AIC-nya dengan
hasil polr(). Apakah kedua fungsi menghasilkan estimasi
koefisien yang serupa?waktu_kirim = 2 hari dan skor_layanan = 9.
Kategori kepuasan mana yang memiliki probabilitas tertinggi untuk
pelanggan tersebut?polr() perlu dibaca dengan hati-hati dibandingkan paket
ordinal lain seperti SPSS PLUM atau Stata
ologit, yang dapat menggunakan konvensi tanda berbeda.Regresi logistik ordinal memanfaatkan urutan alami pada kategori respons melalui model cumulative logit, dengan asumsi kunci berupa proportional odds — efek prediktor yang konstan di seluruh ambang kategori. Model ini lebih hemat parameter dibanding model multinomial, namun validitasnya sangat bergantung pada terpenuhinya asumsi tersebut, sehingga pengujian formal (misalnya uji Brant) menjadi langkah wajib sebelum menyimpulkan hasil.
Regresi Poisson digunakan ketika variabel respons berupa data hitung (count data) — bilangan bulat non-negatif yang menyatakan banyaknya kejadian dalam suatu interval waktu atau ruang tertentu, misalnya jumlah kunjungan rumah sakit, jumlah klaim asuransi, atau jumlah komplain pelanggan per bulan.
Y diasumsikan mengikuti distribusi Poisson dengan parameter rata-rata \(\mu = E(Y \mid x)\):
\[ P(Y = y \mid x) = \frac{e^{-\mu(x)}\mu(x)^y}{y!}, \qquad y = 0, 1, 2, \dots \]
Fungsi penghubung yang digunakan adalah fungsi log, sehingga:
\[ \ln\big(\mu(x)\big) = \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p \quad \Longleftrightarrow \quad \mu(x) = \exp(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p) \]
Fungsi log memastikan \(\mu(x)\) selalu bernilai positif, sesuai dengan sifat data hitung.
Dalam banyak kasus, jumlah kejadian bergantung pada periode atau ukuran paparan (exposure) yang berbeda-beda antarobservasi — misalnya jumlah klaim tergantung lama polis aktif, atau jumlah kecelakaan tergantung volume kendaraan. Untuk itu, model dimodifikasi menjadi:
\[ \ln\left(\frac{\mu(x)}{t}\right) = \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p \quad \Longleftrightarrow \quad \ln(\mu(x)) = \ln(t) + \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p \]
dengan \(t\) adalah ukuran exposure dan \(\ln(t)\) disebut offset — sebuah suku dalam model yang koefisiennya ditetapkan sama dengan 1 (tidak diestimasi).
Sama seperti model-model sebelumnya, parameter diestimasi melalui
maximum likelihood berdasarkan fungsi massa peluang Poisson, dan
dijalankan di R melalui
glm(..., family = poisson(link = "log")).
Karena fungsi penghubungnya adalah log, koefisien diinterpretasikan melalui Incidence Rate Ratio (IRR):
\[ \text{IRR} = e^{\beta_1} \]
Soal. Sebuah pusat layanan pelanggan ingin mengetahui apakah jumlah transaksi per bulan dan status member premium memengaruhi jumlah komplain yang diajukan pelanggan dalam sebulan, berdasarkan data 320 pelanggan.
n <- 320
transaksi <- round(rpois(n, lambda = 8))
premium <- rbinom(n, size = 1, prob = 0.4)
log_mu <- 0.2 + 0.05 * transaksi - 0.5 * premium
mu <- exp(log_mu)
komplain <- rpois(n, lambda = mu)
data_komplain <- tibble(
komplain = komplain,
transaksi = transaksi,
premium = factor(premium, labels = c("Reguler", "Premium"))
)
summary(data_komplain$komplain)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 1.000 1.587 2.000 6.000
ggplot(data_komplain, aes(x = komplain)) +
geom_histogram(binwidth = 1, fill = "steelblue", color = "white") +
labs(title = "Distribusi Jumlah Komplain Pelanggan",
x = "Jumlah Komplain per Bulan", y = "Frekuensi") +
theme_minimal()model_poisson <- glm(
komplain ~ transaksi + premium,
data = data_komplain,
family = poisson(link = "log")
)
summary(model_poisson)##
## Call:
## glm(formula = komplain ~ transaksi + premium, family = poisson(link = "log"),
## data = data_komplain)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.02943 0.13586 0.217 0.829
## transaksi 0.07773 0.01459 5.329 9.89e-08 ***
## premiumPremium -0.62231 0.10376 -5.997 2.00e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 437.58 on 319 degrees of freedom
## Residual deviance: 362.95 on 317 degrees of freedom
## AIC: 978.63
##
## Number of Fisher Scoring iterations: 5
irr <- exp(coef(model_poisson))
ci_irr <- exp(confint(model_poisson))
round(cbind(IRR = irr, ci_irr), 3)## IRR 2.5 % 97.5 %
## (Intercept) 1.030 0.787 1.341
## transaksi 1.081 1.050 1.112
## premiumPremium 0.537 0.436 0.656
Misalnya, jika IRR untuk transaksi bernilai
1,05, artinya setiap tambahan satu transaksi meningkatkan rata-rata
jumlah komplain sebesar 5%, dengan status keanggotaan dikontrol konstan.
Jika IRR untuk premiumPremium bernilai kurang
dari 1, pelanggan premium diprediksi mengajukan lebih sedikit komplain
dibanding pelanggan reguler.
data_komplain$pred_mu <- predict(model_poisson, type = "response")
ggplot(data_komplain, aes(x = transaksi, y = pred_mu, color = premium)) +
geom_point(aes(y = komplain), alpha = 0.3) +
geom_smooth(se = FALSE) +
labs(title = "Prediksi Rata-rata Jumlah Komplain vs Jumlah Transaksi",
x = "Jumlah Transaksi per Bulan", y = "Rata-rata Jumlah Komplain (Prediksi)") +
theme_minimal()Pada grafik prediksi rate Poisson, hal pertama yang perlu diperhatikan adalah bentuk kurva yang cenderung eksponensial, bukan garis lurus — konsekuensi langsung dari penggunaan fungsi penghubung log. Selisih vertikal antara dua kurva (misalnya kurva pelanggan reguler dan pelanggan premium) yang tampak semakin melebar seiring bertambahnya jumlah transaksi juga merupakan ciri khas skala multiplikatif: pada model Poisson dengan fungsi log, dua kelompok yang berbeda status keanggotaan memiliki rasio rata-rata jumlah komplain yang konstan (sesuai nilai IRR) pada setiap tingkat prediktor, sehingga selisih absolutnya justru membesar ketika rata-rata prediksinya membesar. Titik data mentah (scatter) yang tersebar di sekitar kurva prediksi juga dapat digunakan sebagai pemeriksaan visual kasar terhadap kecocokan model — sebaran titik yang jauh lebih lebar dibanding lebar pita kurva prediksi dapat menjadi indikasi awal adanya overdispersion yang perlu diperiksa lebih formal melalui rasio deviance.
Asumsi utama distribusi Poisson adalah equidispersion, yaitu rata-rata dan varians bernilai sama (\(E(Y) = \text{Var}(Y) = \mu\)). Pelanggaran asumsi ini disebut overdispersion (varians > rata-rata) atau underdispersion (varians < rata-rata), dan dapat diperiksa melalui rasio devians terhadap derajat bebas:
dispersi <- summary(model_poisson)$deviance / summary(model_poisson)$df.residual
cat("Rasio dispersi:", round(dispersi, 3),
"\n(Nilai jauh di atas 1 mengindikasikan overdispersion)")## Rasio dispersi: 1.145
## (Nilai jauh di atas 1 mengindikasikan overdispersion)
Jika terjadi overdispersion, alternatif yang dapat digunakan antara lain:
Sebagian praktisi menggunakan transformasi \(\ln(Y)\) atau \(\ln(Y+1)\) lalu menerapkan OLS sebagai pendekatan alternatif untuk data hitung. Pendekatan ini hanya masuk akal jika: (1) nilai \(Y\) relatif besar sehingga distribusinya mendekati kontinu/lognormal, (2) tidak banyak nilai nol pada data, dan (3) tujuan utama adalah estimasi rata-rata pada skala log, bukan estimasi rate kejadian yang tepat. Ketika terdapat banyak nilai nol, transformasi log akan bermasalah (perlu penambahan konstanta sembarang seperti \(\ln(Y+1)\), yang mengubah interpretasi koefisien) dan regresi Poisson (atau negative binomial) tetap menjadi pilihan yang lebih tepat secara teoretis karena secara eksplisit memodelkan sifat diskret dan non-negatif dari data hitung.
Sebagai ilustrasi, mari bandingkan hasil regresi Poisson dengan
pendekatan OLS pada \(\ln(Y+1)\)
menggunakan data data_komplain yang sama.
model_ols_log <- lm(log(komplain + 1) ~ transaksi + premium, data = data_komplain)
summary(model_ols_log)##
## Call:
## lm(formula = log(komplain + 1) ~ transaksi + premium, data = data_komplain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.18374 -0.37812 0.02605 0.37010 1.26250
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.516638 0.084339 6.126 2.67e-09 ***
## transaksi 0.055592 0.009645 5.764 1.95e-08 ***
## premiumPremium -0.360888 0.057620 -6.263 1.23e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4995 on 317 degrees of freedom
## Multiple R-squared: 0.2028, Adjusted R-squared: 0.1978
## F-statistic: 40.32 on 2 and 317 DF, p-value: 2.495e-16
##
## Perbandingan koefisien 'transaksi':
## Poisson (skala log-rate): 0.0777
## OLS log(Y+1): 0.0556
Kedua model umumnya menghasilkan arah pengaruh yang
sama, tetapi besar koefisien dan standard error dapat berbeda
karena OLS log(Y+1) tidak memperhitungkan sifat diskret data maupun
heteroskedastisitas yang melekat pada data hitung. Ketika proporsi nilai
nol pada data cukup besar (pada data ini, periksa
mean(data_komplain$komplain == 0)), penambahan konstanta 1
pada transformasi log menjadi keputusan yang agak sembarang dan dapat
memengaruhi kesimpulan — ini adalah salah satu alasan utama mengapa
regresi Poisson tetap lebih disarankan untuk data hitung.
Sebagai pedoman ringkas, gunakan regresi Poisson (atau negative binomial) ketika data berupa hitungan kecil dengan banyak nilai nol atau ketika tujuan analisis adalah estimasi rate kejadian secara langsung. Pertimbangkan OLS pada log(Y) hanya sebagai pendekatan kasar ketika nilai Y cukup besar, hampir tidak ada nilai nol, dan kesederhanaan interpretasi pada skala log dianggap cukup memadai untuk tujuan deskriptif.
model_poisson dengan menambahkan offset
berupa log(lama_keanggotaan) (misalkan Anda membuat
variabel simulasi baru untuk lama keanggotaan dalam bulan). Jelaskan
bagaimana interpretasi koefisien berubah setelah exposure
ditambahkan.model_poisson. Jika
ditemukan indikasi overdispersion, estimasi ulang model menggunakan
family = quasipoisson(link = "log") atau
MASS::glm.nb(), lalu bandingkan standard error kedua
pendekatan tersebut.data_komplain$komplain
dan bandingkan dengan proporsi nol yang diharapkan dari distribusi
Poisson dengan rata-rata yang sama (\(P(Y=0) =
e^{-\bar{Y}}\)). Apakah ada indikasi excess zeros yang
memerlukan model Zero-Inflated Poisson?Regresi Poisson memodelkan data hitung menggunakan fungsi penghubung log sehingga prediksi rata-rata kejadian selalu bernilai positif. Interpretasi koefisien dilakukan melalui incidence rate ratio, dan asumsi kunci yang wajib diperiksa adalah equidispersion. Ketika data menunjukkan overdispersion atau proporsi nol yang berlebihan, model alternatif seperti negative binomial, quasi-Poisson, atau zero-inflated Poisson perlu dipertimbangkan sebagai pengganti OLS pada log(Y).
| Aspek | Biner | Multinomial | Ordinal | Poisson |
|---|---|---|---|---|
| Skala respons | 2 kategori | >2 kategori, nominal | >2 kategori, ordinal | Hitungan (0, 1, 2, …) |
| Fungsi penghubung | Logit | Logit (baseline-category) | Logit (cumulative) | Log |
| Jumlah persamaan | 1 | \(J-1\) | \(J-1\) cutpoint, 1 set \(\beta\) | 1 |
| Fungsi R utama | glm(family=binomial) |
multinom() (paket nnet) |
polr() (paket MASS) |
glm(family=poisson) |
| Ukuran efek | Odds Ratio | Odds Ratio per kategori | Odds Ratio (proportional odds) | Incidence Rate Ratio |
| Asumsi khas | Linearitas logit | IIA | Proportional odds | Equidispersion |
Diagram alur sederhana untuk memilih model yang tepat:
Untuk mengonsolidasikan pemahaman terhadap keempat model, bagian ini menyajikan sebuah skenario penelitian tunggal yang sengaja menghasilkan empat jenis variabel respons berbeda, sehingga pembaca dapat melihat secara langsung bagaimana rumusan pertanyaan penelitian menentukan pilihan model.
Konteks penelitian. Sebuah dinas kesehatan daerah melakukan survei terhadap 500 rumah tangga untuk mengevaluasi program intervensi gizi. Dari satu survei yang sama, peneliti dapat menyusun beberapa pertanyaan penelitian berbeda:
Ilustrasi ini menegaskan sebuah prinsip penting: model yang tepat ditentukan oleh bentuk variabel respons, bukan oleh bidang ilmu atau jenis data prediktor. Dataset yang identik dapat memunculkan keempat jenis model sekaligus, tergantung bagaimana peneliti merumuskan variabel outcome yang ingin dianalisis.
Terlepas dari model mana yang dipilih, alur kerja umum berikut disarankan untuk seluruh analisis data kategori maupun data hitung:
glm(), multinom(), polr()),
dimulai dari model sederhana kemudian ditambahkan prediktor secara
bertahap jika diperlukan.Model biner: “Hasil regresi logistik biner menunjukkan bahwa rasio cicilan terhadap pendapatan berpengaruh signifikan terhadap peluang menunggak kredit (\(p<0{,}05\)), dengan odds ratio sebesar X, yang berarti setiap kenaikan satu poin persentase rasio cicilan meningkatkan odds menunggak sebesar (X-1)×100%, dengan lama bekerja dikontrol konstan.”
Model Poisson: “Regresi Poisson menunjukkan bahwa status keanggotaan premium berpengaruh signifikan terhadap jumlah komplain pelanggan (\(p<0{,}05\)), dengan incidence rate ratio sebesar X, yang berarti pelanggan premium diprediksi mengajukan komplain (1-X)×100% lebih sedikit dibanding pelanggan reguler, dengan jumlah transaksi dikontrol konstan.”
Model multinomial: “Hasil regresi logistik multinomial menunjukkan bahwa jarak tempuh berpengaruh signifikan terhadap pilihan moda Motor dibandingkan Angkutan Umum (\(p<0{,}05\)), dengan odds ratio sebesar X, yang berarti setiap kenaikan 1 km jarak tempuh meningkatkan odds memilih Motor dibanding Angkutan Umum sebesar (X-1)×100%, dengan pendapatan dikontrol konstan. Sebaliknya, terhadap pilihan Mobil, pendapatan keluarga menjadi prediktor yang lebih dominan dibandingkan jarak tempuh.”
Model ordinal: “Hasil regresi logistik ordinal (cumulative logit) menunjukkan bahwa skor layanan pelanggan berpengaruh signifikan terhadap tingkat kepuasan (\(p<0{,}05\)), dengan odds ratio sebesar X, yang berarti setiap kenaikan satu poin skor layanan meningkatkan odds berada pada tingkat kepuasan yang lebih tinggi sebesar (X-1)×100%, dengan asumsi proportional odds terpenuhi dan waktu pengiriman dikontrol konstan.”
Perhatikan bahwa pada ketiga contoh di atas, pelaporan selalu mencakup tiga elemen penting: (1) arah dan besar ukuran efek (odds ratio atau IRR), (2) status signifikansi statistik beserta nilai p, dan (3) pernyataan eksplisit bahwa interpretasi berlaku ceteris paribus (variabel lain dikontrol konstan). Pelaporan yang hanya menyebutkan “berpengaruh signifikan” tanpa menyertakan ketiga elemen ini dianggap tidak lengkap dalam standar penulisan ilmiah bidang statistika terapan.
1. Apakah odds ratio sama dengan risk ratio (relative risk)? Tidak selalu. Odds ratio mendekati risk ratio hanya ketika kejadian yang diteliti tergolong jarang (rare event, biasanya prevalensi < 10%). Pada kejadian yang umum terjadi, odds ratio cenderung membesar-lebihkan (overestimate) risk ratio, sehingga interpretasi keduanya perlu dibedakan secara hati-hati, khususnya dalam studi epidemiologi.
2. Bolehkah menggunakan regresi logistik multinomial ketika kategori sebenarnya ordinal? Boleh secara teknis, dan kadang menjadi pilihan yang lebih aman ketika asumsi proportional odds pada model ordinal jelas dilanggar. Namun, model multinomial akan mengabaikan informasi urutan yang sebenarnya tersedia, sehingga model menjadi kurang efisien (memerlukan lebih banyak parameter) dibandingkan model ordinal yang sesuai.
3. Berapa ukuran sampel minimum yang diperlukan? Tidak ada angka tunggal yang berlaku universal, tetapi pedoman umum untuk model logistik biner adalah minimal 10–20 kejadian per prediktor (events per variable). Untuk model multinomial dan ordinal, pedoman serupa berlaku untuk kategori dengan frekuensi paling kecil. Untuk regresi Poisson, kecukupan sampel lebih ditentukan oleh rata-rata jumlah kejadian (nilai \(\mu\)) yang tidak terlalu kecil pada seluruh kombinasi prediktor.
4. Apa perbedaan utama antara fungsi link logit dan probit? Keduanya sama-sama menghasilkan kurva berbentuk S dan sering memberikan kesimpulan substantif yang serupa. Perbedaan utamanya terletak pada distribusi yang mendasari (logistik vs normal baku) dan kemudahan interpretasi: koefisien logit dapat diinterpretasikan melalui odds ratio, sedangkan koefisien probit tidak memiliki interpretasi odds ratio yang setara sehingga lebih jarang digunakan dalam pelaporan terapan.
5. Apakah negative binomial selalu lebih baik daripada Poisson? Tidak selalu. Ketika data benar-benar memenuhi asumsi equidispersion, regresi Poisson lebih efisien (standard error lebih kecil) dibandingkan negative binomial. Negative binomial baru direkomendasikan ketika terdapat bukti overdispersion yang jelas, misalnya dari rasio dispersi yang jauh melebihi 1 atau dari uji formal seperti uji Lagrange Multiplier untuk overdispersion.
6. Bagaimana menentukan variabel mana yang harus dijadikan offset pada regresi Poisson? Offset dipilih berdasarkan ukuran paparan yang secara logis menentukan kesempatan terjadinya peristiwa yang dihitung, bukan berdasarkan signifikansi statistik. Misalnya, jumlah klaim asuransi secara alami bergantung pada lama polis aktif, sehingga lama polis menjadi kandidat offset yang tepat meskipun tidak diuji signifikansinya seperti prediktor biasa — koefisiennya memang sengaja ditetapkan sama dengan 1 karena secara teoretis rate kejadian per satuan exposure adalah kuantitas yang ingin dimodelkan, bukan jumlah total kejadian itu sendiri.
7. Apakah boleh membandingkan nilai AIC antara model logistik biner dan model Poisson untuk menentukan model “terbaik”? Tidak. Nilai AIC hanya valid dibandingkan antar model yang diestimasi dari distribusi respons yang sama dan pada data (jumlah observasi) yang identik. Membandingkan AIC lintas keluarga distribusi (misalnya Binomial vs Poisson) tidak memiliki dasar teoretis yang valid, karena skala likelihood kedua distribusi tersebut tidak dapat diperbandingkan secara langsung. Pemilihan jenis model tetap harus didasarkan pada bentuk variabel respons sejak awal, bukan hasil perbandingan AIC lintas keluarga model yang berbeda.
Bagian ini menyajikan empat studi kasus naratif yang dirancang untuk melatih kemampuan pembaca dalam mengidentifikasi jenis model yang tepat, bukan sekadar menjalankan kode R. Untuk setiap kasus, tentukan: (a) jenis variabel respons, (b) model yang paling sesuai, (c) prediktor apa saja yang relevan untuk dimasukkan, dan (d) asumsi apa yang perlu diperiksa sebelum menyimpulkan hasil.
Kasus 1 — Perbankan. Sebuah bank ingin mengetahui faktor yang memengaruhi keputusan nasabah dalam memilih jenis produk tabungan: tabungan reguler, tabungan berjangka, atau tabungan investasi. Data yang tersedia mencakup usia nasabah, pendapatan bulanan, dan tingkat literasi keuangan (diukur dalam skor 0–100). Peneliti tidak menganggap ketiga jenis tabungan tersebut memiliki tingkatan tertentu satu sama lain.
Kasus 2 — Pendidikan. Sebuah sekolah ingin memodelkan jumlah hari absen siswa selama satu semester (0 hingga puluhan hari) berdasarkan jarak rumah ke sekolah, status ekonomi keluarga, dan partisipasi dalam kegiatan ekstrakurikuler. Semester untuk setiap siswa memiliki jumlah hari efektif belajar yang sedikit berbeda-beda karena perbedaan jadwal kelas.
Kasus 3 — Kesehatan Masyarakat. Sebuah studi kesehatan mengukur tingkat keparahan gejala pasien pasca-perawatan dalam empat kategori berurutan: tidak ada gejala, ringan, sedang, dan berat. Prediktor yang tersedia meliputi usia pasien, lama rawat inap, dan kepatuhan minum obat (patuh/tidak patuh).
Kasus 4 — Pemasaran Digital. Sebuah perusahaan e-commerce ingin mengetahui apakah pengguna akan melakukan pembelian ulang dalam 30 hari ke depan (ya/tidak) berdasarkan riwayat jumlah kunjungan situs, jumlah produk dalam wishlist, dan apakah pengguna pernah menggunakan kode promo.
Petunjuk pengerjaan. Untuk setiap kasus, tuliskan terlebih dahulu identifikasi jenis variabel respons sebelum menuliskan kode R. Sebagai panduan cepat, ingat kembali pedoman berikut: variabel biner mengarah pada regresi logistik biner, variabel kategori nominal lebih dari dua level mengarah pada regresi multinomial, variabel kategori berurutan mengarah pada regresi ordinal (dengan catatan pemeriksaan proportional odds), dan variabel hitungan non-negatif — apalagi dengan periode observasi yang bervariasi seperti pada Kasus 2 — mengarah pada regresi Poisson dengan mempertimbangkan penggunaan offset.
Setelah menentukan model yang tepat, cobalah membuat data simulasi sendiri (mengikuti pola pada bab-bab sebelumnya) untuk masing-masing kasus, lalu estimasi model, interpretasikan koefisien utamanya, dan periksa minimal satu asumsi kunci dari model yang dipilih.
Ebook ini telah membahas empat model utama untuk analisis data kategori dan data hitung: regresi logistik biner, multinomial, ordinal, dan regresi Poisson. Keempatnya merupakan bagian dari keluarga generalized linear model yang menggunakan fungsi penghubung berbeda sesuai skala pengukuran variabel respons. Pemilihan model yang tepat — beserta pemeriksaan asumsi yang menyertainya — merupakan langkah krusial agar kesimpulan penelitian valid dan dapat dipertanggungjawabkan secara statistik.
Beberapa pesan kunci yang perlu selalu diingat pembaca setiap kali menghadapi data kategori atau data hitung dalam praktik nyata:
Pembaca disarankan untuk berlatih dengan data riil dari bidang masing- masing (kesehatan, pendidikan, pemasaran, sosial, dsb.) serta mendalami topik lanjutan seperti regresi ordinal dengan partial proportional odds, negative binomial regression, zero-inflated models, dan model logistik dengan efek acak (mixed-effects logistic regression) untuk data yang memiliki struktur berkelompok (clustered/panel data). Penguasaan terhadap keempat model dasar dalam ebook ini merupakan fondasi yang kuat sebelum melangkah ke topik-topik lanjutan tersebut.
Bagian ini merangkum fungsi R utama yang digunakan sepanjang ebook, lengkap dengan penjelasan argumen-argumen pentingnya, sebagai referensi cepat bagi pembaca.
1. Regresi logistik biner — glm()
formula dituliskan dalam bentuk
respons ~ prediktor1 + prediktor2, dengan
respons berupa faktor dua level atau vektor numerik 0/1.
Argumen family = binomial(link = "logit") memberi tahu R
bahwa komponen acak mengikuti distribusi Binomial (Bernoulli untuk data
individual) dan fungsi penghubungnya adalah logit. Fungsi
summary() menampilkan koefisien pada skala log-odds,
sedangkan exp(coef(...)) mengonversinya ke skala odds
ratio.
2. Regresi logistik multinomial — multinom()
(paket nnet)
Variabel respons pada formula harus berupa faktor
nominal dengan lebih dari dua level. Kategori pertama pada
levels() (atau kategori yang ditetapkan melalui
relevel()) secara otomatis menjadi kategori referensi.
Argumen trace = FALSE menonaktifkan output iterasi optimasi
agar tampilan lebih ringkas. Karena multinom() tidak
berbasis kerangka glm() standar, nilai p-value tidak
ditampilkan otomatis dan perlu dihitung manual dari rasio koefisien
terhadap standard error-nya (z-value), sebagaimana ditunjukkan pada Bab
2.
3. Regresi logistik ordinal — polr() (paket
MASS)
Variabel respons harus berupa faktor terurut
(ordered = TRUE saat pembuatan faktor). Argumen
Hess = TRUE memastikan matriks Hessian dihitung sehingga
standard error koefisien dapat diperoleh melalui summary().
Sama seperti multinom(), nilai p-value dihitung manual
menggunakan pendekatan distribusi normal baku terhadap t-value yang
dilaporkan.
4. Regresi Poisson — glm() dengan
family = poisson
Argumen family = poisson(link = "log") menetapkan
komponen acak Poisson dengan fungsi penghubung log. Argumen opsional
offset dapat ditambahkan langsung dalam
formula (misalnya
y ~ x1 + x2 + offset(log(exposure))) atau melalui argumen
terpisah offset =, digunakan ketika periode/ukuran paparan
berbeda antar observasi. Jika ditemukan overdispersion,
family = poisson(...) dapat diganti dengan
family = quasipoisson(...) atau digunakan fungsi
MASS::glm.nb() untuk model negative binomial.
Fungsi pendukung umum yang berlaku untuk hampir
semua model di atas:
predict(model, type = "response"/"class"/"probs") untuk
menghasilkan nilai prediksi, confint(model) untuk interval
kepercayaan koefisien,
anova(model1, model2, test = "Chisq") untuk membandingkan
model bersarang (nested models), dan AIC(model) /
BIC(model) untuk membandingkan model yang tidak
bersarang.
Dokumen ini ditulis dalam format R Markdown (.Rmd) dan dapat di-knit menjadi HTML, PDF, atau Word menggunakan RStudio. Semua data yang digunakan bersifat simulasi (disimulasikan langsung pada setiap chunk R) sehingga dokumen ini dapat dijalankan ulang secara mandiri (reproducible) tanpa memerlukan berkas data eksternal.