1 Pendahuluan

Regresi linier klasik mengasumsikan variabel respons bersifat kontinu dan berdistribusi normal. Dalam banyak konteks nyata, asumsi ini tidak terpenuhi. Materi ini memperkenalkan empat kelas model untuk menangani respons non-kontinu:

  • Regresi logistik biner — respons dua kategori (ya/tidak)
  • Regresi logistik multinomial — respons nominal lebih dari dua kategori (tanpa urutan)
  • Regresi logistik ordinal — respons ordinal (ada urutan alami)
  • Regresi Poisson — respons berupa data hitung (count data)

Keempat model ini merupakan anggota dari keluarga Generalized Linear Model (GLM) yang masing-masing menggunakan fungsi penghubung (link function) yang sesuai.


2 Dataset

Dataset yang digunakan adalah UCI Student Performance Dataset data siswa sekolah menengah di Portugal yang mencakup informasi akademik, demografis, dan perilaku.

# Membaca Data
df <- read.csv("D:\\Ester\\Analisis Data Kategori (ADK)\\html adk\\student-por.csv",
               sep = ";", stringsAsFactors = TRUE)

# Cek dimensi dan nama kolom
dim(df)
[1] 649  33
names(df)
 [1] "school"     "sex"        "age"        "address"    "famsize"   
 [6] "Pstatus"    "Medu"       "Fedu"       "Mjob"       "Fjob"      
[11] "reason"     "guardian"   "traveltime" "studytime"  "failures"  
[16] "schoolsup"  "famsup"     "paid"       "activities" "nursery"   
[21] "higher"     "internet"   "romantic"   "famrel"     "freetime"  
[26] "goout"      "Dalc"       "Walc"       "health"     "absences"  
[31] "G1"         "G2"         "G3"        
# --- PERSIAPAN VARIABEL ---

# 1. Konversi 'higher' ke faktor binary
#    level = c("no","yes") → "yes" dikodekan sebagai 1 (kategori yang dimodelkan)
df$higher <- factor(df$higher, levels = c("no", "yes"))

# 2. Pastikan 'Mjob' berupa factor
df$Mjob <- as.factor(df$Mjob)

# 3. Buat variabel ordinal G3_level dari G3
#    Rendah = 0–9, Sedang = 10–13, Tinggi = 14–20
df$G3_level <- cut(df$G3,
                   breaks  = c(-1, 9, 13, 20),
                   labels  = c("Rendah", "Sedang", "Tinggi"),
                   ordered = TRUE)

# 4. Cek struktur variabel kunci
str(df[, c("higher", "Mjob", "G3_level", "absences",
           "Medu", "studytime", "failures",
           "internet", "schoolsup", "sex", "age", "Dalc", "health")])
'data.frame':   649 obs. of  13 variables:
 $ higher   : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
 $ Mjob     : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
 $ G3_level : Ord.factor w/ 3 levels "Rendah"<"Sedang"<..: 2 2 2 3 2 2 2 2 3 2 ...
 $ absences : int  4 2 6 0 0 6 0 2 0 0 ...
 $ Medu     : int  4 1 1 4 3 4 2 4 3 3 ...
 $ studytime: int  2 2 2 3 2 2 2 2 2 2 ...
 $ failures : int  0 0 0 0 0 0 0 0 0 0 ...
 $ internet : Factor w/ 2 levels "no","yes": 1 2 2 2 1 2 2 1 2 2 ...
 $ schoolsup: Factor w/ 2 levels "no","yes": 2 1 2 1 1 1 1 2 1 1 ...
 $ sex      : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
 $ age      : int  18 17 15 15 16 16 16 17 15 15 ...
 $ Dalc     : int  1 1 2 1 1 1 1 1 1 1 ...
 $ health   : int  3 3 3 5 5 5 3 1 1 5 ...

Tabel 1 — Variabel yang digunakan dalam analisis

Variabel Tipe Keterangan Digunakan pada
higher Biner (yes/no) Ingin melanjutkan kuliah Regresi Biner (Y)
Mjob Nominal (5 kelas) Pekerjaan ibu Multinomial (Y)
G3_level Ordinal (3 level) Tingkatan nilai akhir G3 Ordinal (Y)
absences Count (0–75) Jumlah ketidakhadiran Poisson (Y)
Medu Ordinal (0–4) Pendidikan ibu Biner, Multinomial, Ordinal
studytime Ordinal (1–4) Waktu belajar per minggu Biner, Ordinal
failures Integer (0–3) Jumlah kegagalan kelas Biner, Ordinal
internet Biner (yes/no) Akses internet di rumah Multinomial
schoolsup Biner (yes/no) Dukungan sekolah ekstra Ordinal
sex Biner (F/M) Jenis kelamin Poisson
age Numerik Usia siswa Poisson
Dalc Ordinal (1–5) Konsumsi alkohol harian Poisson
health Ordinal (1–5) Tingkat kesehatan Poisson

3 Regresi Logistik Biner

Model I — Respons Biner · higher (yes/no)

3.1 Landasan Teori

Regresi logistik biner digunakan ketika variabel respons bersifat dikotomi (dua kategori). Model ini memodelkan log-odds (logit) probabilitas kejadian sebagai fungsi linear dari prediktor:

\[\log\left[\frac{\pi}{1-\pi}\right] = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p\]

dengan \(\pi = P(Y = 1 \mid \mathbf{x})\). Probabilitas diperoleh melalui fungsi logistik:

\[\pi = \frac{\exp(\beta_0 + \mathbf{x}'\boldsymbol{\beta})}{1 + \exp(\beta_0 + \mathbf{x}'\boldsymbol{\beta})}\]

Interpretasi koefisien menggunakan Odds Ratio (OR) = exp(β). Jika OR > 1, kenaikan prediktor meningkatkan odds kejadian; jika OR < 1, kenaikan prediktor menurunkan odds.

3.2 Implementasi R

Variabel respons: higher (apakah siswa ingin melanjutkan pendidikan tinggi).
Prediktor: pendidikan ibu (Medu), waktu belajar (studytime), dan riwayat kegagalan (failures).

# --- 1. REGRESI LOGISTIK BINER ---
fit_biner <- glm(higher ~ Medu + studytime + failures,
                 family = binomial(link = "logit"), data = df)
summary(fit_biner)

Call:
glm(formula = higher ~ Medu + studytime + failures, family = binomial(link = "logit"), 
    data = df)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.1508     0.4538  -0.332 0.739628    
Medu          0.5702     0.1359   4.197 2.71e-05 ***
studytime     0.7997     0.2170   3.686 0.000228 ***
failures     -0.8487     0.1614  -5.257 1.47e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 439.69  on 648  degrees of freedom
Residual deviance: 359.91  on 645  degrees of freedom
AIC: 367.91

Number of Fisher Scoring iterations: 6
# Odds Ratio = exp(β̂)
round(exp(coef(fit_biner)), 4)
(Intercept)        Medu   studytime    failures 
     0.8600      1.7686      2.2249      0.4280 
# Goodness-of-fit: penurunan devians
delta_dev <- fit_biner$null.deviance - fit_biner$deviance
delta_df  <- fit_biner$df.null - fit_biner$df.residual
p_gof     <- pchisq(delta_dev, df = delta_df, lower.tail = FALSE)
cat("Null deviance    :", round(fit_biner$null.deviance, 2), "\n")
Null deviance    : 439.69 
cat("Residual deviance:", round(fit_biner$deviance, 2), "\n")
Residual deviance: 359.91 
cat("Delta deviance   :", round(delta_dev, 2), " (df =", delta_df, ")\n")
Delta deviance   : 79.78  (df = 3 )
cat("p-value (chi²)   :", format.pval(p_gof, digits = 3), "\n")
p-value (chi²)   : <2e-16 

3.3 Hasil & Interpretasi

Tabel 2 — Koefisien, OR, dan Signifikansi Model Biner (Y = higher)

Prediktor β̂ SE z p-value OR = exp(β̂) Interpretasi
(Intercept) −0.1508 0.4538 −0.332 0.7396 0.860
Medu 0.5702 0.1359 4.197 <0.001 *** 1.769 Tiap kenaikan 1 level pendidikan ibu → odds ingin kuliah naik 76,9%
studytime 0.7997 0.2170 3.686 <0.001 *** 2.225 Tiap kenaikan 1 level waktu belajar → odds ingin kuliah naik 122,5%
failures −0.8487 0.1614 −5.257 <0.001 *** 0.428 Tiap tambahan 1 kegagalan → odds ingin kuliah turun 57,2%

Interpretasi Utama: failures adalah prediktor terkuat (p = 1.47×10⁻⁷). Setiap tambahan satu kegagalan akademik menurunkan odds siswa ingin melanjutkan kuliah menjadi hanya 0.428 kali (turun 57,2%). studytime (OR = 2.225): siswa yang belajar lebih lama memiliki odds ingin kuliah 2,22 kali lebih besar. Medu (OR = 1.769): semakin tinggi pendidikan ibu, semakin besar dorongan anak untuk melanjutkan pendidikan. Uji penurunan devians (Δ devians, df = 3) menunjukkan model secara keseluruhan signifikan (p < 0.001).


4 Regresi Logistik Multinomial

Model II — Respons Nominal · Mjob (5 kategori)

4.1 Landasan Teori

Regresi logistik multinomial digunakan ketika variabel respons memiliki lebih dari dua kategori yang tidak berurutan (nominal). Menggunakan pendekatan baseline-category logit — satu kategori dipilih sebagai referensi, dan model membentuk \(K-1\) persamaan logit.

Untuk setiap kategori \(k = 1, \ldots, K-1\) terhadap kategori referensi \(K\) (Agresti, 2002):

\[\log\left[\frac{\pi_k}{\pi_K}\right] = \alpha_k + \beta_{k1} x_1 + \cdots + \beta_{kp} x_p\]

Perbandingan antar kategori non-referensi dapat diturunkan dari selisih dua logit tersebut:

\[\log\left[\frac{\pi_j}{\pi_k}\right] = \log\left[\frac{\pi_j}{\pi_K}\right] - \log\left[\frac{\pi_k}{\pi_K}\right] = (\alpha_j - \alpha_k) + (\boldsymbol{\beta}_j - \boldsymbol{\beta}_k)'\mathbf{x}\]

Koefisien diinterpretasikan sebagai perubahan log-odds memilih kategori \(k\) dibanding referensi. Jika dieksponensialkan: RRR = exp(β) (Relative Risk Ratio).

Catatan: Fungsi multinom() dari paket nnet tidak menyediakan p-value secara otomatis. Nilai signifikansi dihitung manual dengan z-test: \(z = \hat{\beta} / SE\), kemudian \(p = 2\left(1 - \Phi(|z|)\right)\).

4.2 Implementasi R

Variabel respons: Mjob (pekerjaan ibu: at_home, health, other, services, teacher).
Kategori referensi: “other”. Prediktor: Medu dan internet.

# --- 2. REGRESI LOGISTIK MULTINOMIAL ---
library(nnet)

# Set kategori referensi "other"
df$Mjob <- relevel(as.factor(df$Mjob), ref = "other")

fit_multi <- multinom(Mjob ~ Medu + internet, data = df, trace = FALSE)
summary(fit_multi)
Call:
multinom(formula = Mjob ~ Medu + internet, data = df, trace = FALSE)

Coefficients:
         (Intercept)       Medu internetyes
at_home    0.8144364 -0.5660528  -0.5645585
health    -7.1446564  1.6345532   0.7458991
services  -2.8171393  0.5702459   0.9128492
teacher  -15.7905581  3.8682410   1.2763987

Std. Errors:
         (Intercept)      Medu internetyes
at_home    0.2804483 0.1249853   0.2309637
health     0.9218212 0.2353898   0.5271006
services   0.3998539 0.1135154   0.3149030
teacher    2.3790703 0.5904053   0.6114182

Residual Deviance: 1516.307 
AIC: 1540.307 
# Hitung p-value via Z-test: z = β̂ / SE
z_scores <- summary(fit_multi)$coefficients / summary(fit_multi)$standard.errors
p_values  <- (1 - pnorm(abs(z_scores), 0, 1)) * 2

cat("--- Tabel P-Values ---\n")
--- Tabel P-Values ---
print(round(p_values, 4))
         (Intercept) Medu internetyes
at_home       0.0037    0      0.0145
health        0.0000    0      0.1570
services      0.0000    0      0.0037
teacher       0.0000    0      0.0368
cat("\n--- Tabel Odds Ratio (RRR = exp(β̂)) ---\n")

--- Tabel Odds Ratio (RRR = exp(β̂)) ---
print(round(exp(summary(fit_multi)$coefficients), 3))
         (Intercept)   Medu internetyes
at_home        2.258  0.568       0.569
health         0.001  5.127       2.108
services       0.060  1.769       2.491
teacher        0.000 47.858       3.584
# Goodness-of-fit: AIC dan penurunan devians
cat("AIC model multinomial:", AIC(fit_multi), "\n")
AIC model multinomial: 1540.307 
cat("Residual deviance    :", fit_multi$deviance, "\n")
Residual deviance    : 1516.307 

4.3 Hasil & Interpretasi

Tabel 3 — Koefisien, RRR, dan p-value Model Multinomial (referensi: other)

Kategori Prediktor β̂ SE p-value RRR = exp(β̂)
at_home Medu −0.566 0.125 <0.001 *** 0.568
internet(yes) −0.565 0.231 0.015 * 0.569
health Medu 1.635 0.235 <0.001 *** 5.127
internet(yes) 0.746 0.527 0.157 2.108
services Medu 0.570 0.114 <0.001 *** 1.769
internet(yes) 0.913 0.315 0.004 ** 2.491
teacher Medu 3.868 0.590 <0.001 *** 47.858
internet(yes) 1.276 0.611 0.037 * 3.584

Interpretasi Utama: Medu merupakan prediktor sangat signifikan di semua kategori (p < 0.001). Efek paling dramatis ada pada kategori teacher: setiap kenaikan 1 level pendidikan ibu meningkatkan odds ibu bekerja sebagai guru (vs. other) sebesar RRR = 47.86 kali. Nilai RRR yang sangat besar ini perlu dicermati — kemungkinan mencerminkan sparse data pada sel guru dengan Medu rendah, sehingga estimasi kurang stabil. internet(yes): ibu yang anaknya memiliki akses internet cenderung bekerja di sektor services (RRR = 2.49) dan teacher (RRR = 3.58) dibanding other, sedangkan odds ibu at_home lebih rendah (RRR = 0.57).


5 Regresi Logistik Ordinal

Model III — Respons Ordinal · G3_level (Rendah / Sedang / Tinggi)

5.1 Landasan Teori

Regresi logistik ordinal (proportional odds model) digunakan ketika variabel respons memiliki urutan alami. Model ini memodelkan log-odds kumulatif (cumulative logit).

Konvensi slide/PDF (Agresti):

\[\text{logit}\{P(Y \leq j \mid \mathbf{x})\} = \alpha_j + \mathbf{x}'\boldsymbol{\beta}, \quad j = 1, \ldots, J-1\]

Pada konvensi ini, \(\beta > 0\) berarti kenaikan prediktor meningkatkan peluang kumulatif \(P(Y \leq j)\), sehingga respons cenderung bergeser ke kategori lebih rendah. Jika \(\beta < 0\), respons cenderung bergeser ke kategori lebih tinggi.

Terdapat \(J-1\) cutpoint (\(\alpha_j\)) tetapi hanya satu vektor koefisien \(\boldsymbol{\beta}\) — ini adalah asumsi proportional odds (parallel lines). Probabilitas setiap kategori:

\[P(Y = j) = P(Y \leq j) - P(Y \leq j-1)\]

Konvensi tanda MASS::polr() menggunakan \(\text{logit}\{P(Y \leq j)\} = \alpha_j - \mathbf{x}'\boldsymbol{\beta}\), berlawanan dengan konvensi slide. Pada output polr(): OR > 1 berarti prediktor mendorong ke kategori lebih tinggi (kebalikan dari konvensi slide). Untuk mengonversi ke konvensi slide: \(\hat{\beta}_{\text{slide}} = -\hat{\beta}_{\text{polr}}\). Tabel di bawah melaporkan output polr() apa adanya, dengan interpretasi mengikuti konvensi polr().

5.2 Implementasi R

Variabel respons: G3_level (sudah dibuat di data-prep: Rendah ≤9, Sedang 10–13, Tinggi ≥14).
Prediktor: studytime, failures, schoolsup.

# --- 3. REGRESI LOGISTIK ORDINAL ---
library(MASS)

# Cek struktur ordinal
str(df$G3_level)
 Ord.factor w/ 3 levels "Rendah"<"Sedang"<..: 2 2 2 3 2 2 2 2 3 2 ...
# Fit model proportional odds
fit_ord <- polr(G3_level ~ studytime + failures + schoolsup,
                data = df, Hess = TRUE)
summary(fit_ord)
Call:
polr(formula = G3_level ~ studytime + failures + schoolsup, data = df, 
    Hess = TRUE)

Coefficients:
               Value Std. Error t value
studytime     0.4814    0.09705   4.960
failures     -1.3293    0.16616  -8.000
schoolsupyes -0.7845    0.25245  -3.108

Intercepts:
              Value   Std. Error t value
Rendah|Sedang -1.4139  0.2207    -6.4063
Sedang|Tinggi  1.5701  0.2173     7.2259

Residual Deviance: 1145.768 
AIC: 1155.768 
# Hitung p-value dari t-value (pendekatan normal)
t_table         <- as.data.frame(coef(summary(fit_ord)))
t_table$p_value <- round(2 * (1 - pnorm(abs(t_table$`t value`))), 4)
print(t_table)
                   Value Std. Error   t value p_value
studytime      0.4813945 0.09705358  4.960090  0.0000
failures      -1.3293172 0.16616257 -8.000100  0.0000
schoolsupyes  -0.7845421 0.25244996 -3.107713  0.0019
Rendah|Sedang -1.4138909 0.22070467 -6.406257  0.0000
Sedang|Tinggi  1.5700598 0.21728319  7.225869  0.0000
# Odds Ratio (konvensi polr)
cat("\n--- Odds Ratio (konvensi polr) ---\n")

--- Odds Ratio (konvensi polr) ---
round(exp(coef(fit_ord)), 4)
   studytime     failures schoolsupyes 
      1.6183       0.2647       0.4563 
# Goodness-of-fit: penurunan devians (null vs fitted)
# Null model: hanya intercepts (cutpoints)
fit_ord_null <- polr(G3_level ~ 1, data = df, Hess = TRUE)

delta_dev_ord <- fit_ord_null$deviance - fit_ord$deviance
delta_df_ord  <- length(coef(fit_ord))   # jumlah prediktor
p_ord         <- pchisq(delta_dev_ord, df = delta_df_ord, lower.tail = FALSE)

cat("Devians null model  :", round(fit_ord_null$deviance, 2), "\n")
Devians null model  : 1270.95 
cat("Devians fitted model:", round(fit_ord$deviance, 2), "\n")
Devians fitted model: 1145.77 
cat("Delta devians       :", round(delta_dev_ord, 2),
    " (df =", delta_df_ord, ")\n")
Delta devians       : 125.18  (df = 3 )
cat("p-value (chi²)      :", format.pval(p_ord, digits = 3), "\n")
p-value (chi²)      : <2e-16 
cat("AIC                 :", AIC(fit_ord), "\n")
AIC                 : 1155.768 

5.3 Hasil & Interpretasi

Tabel 4 — Koefisien, OR, dan p-value Model Ordinal (Y = G3_level, konvensi polr())

Parameter Jenis β̂ (polr) β̂ (slide) SE t-value p-value OR (polr)
studytime Koefisien 0.4814 −0.4814 0.0971 4.960 <0.001 *** 1.618
failures Koefisien −1.3293 1.3293 0.1662 −8.000 <0.001 *** 0.265
schoolsup(yes) Koefisien −0.7845 0.7845 0.2524 −3.108 0.002 ** 0.456
Rendah|Sedang Cutpoint α₁ −1.4139 0.2207 −6.406 <0.001
Sedang|Tinggi Cutpoint α₂ 1.5701 0.2173 7.226 <0.001

Kolom β̂ (slide) = −β̂ (polr), untuk pembanding dengan notasi materi kuliah.

Interpretasi Utama (menggunakan konvensi polr()):

  • failures (OR = 0.265, p < 0.001): prediktor terkuat. Setiap tambahan satu kegagalan kelas menurunkan odds siswa berada di kategori nilai lebih tinggi menjadi hanya 0.265 kali (turun 73,5%). Dalam konvensi slide, \(\hat{\beta}_{\text{slide}} = +1.3293 > 0\), artinya failures mendorong peluang kumulatif ke kategori lebih rendah — konsisten dengan kedua konvensi.
  • studytime (OR = 1.618): setiap kenaikan 1 level waktu belajar meningkatkan odds berada di kategori nilai lebih tinggi sebesar 61,8%.
  • schoolsup(yes) (OR = 0.456): siswa yang menerima dukungan sekolah ekstra cenderung berada di kategori nilai lebih rendah — mencerminkan bahwa dukungan ekstra memang diberikan kepada siswa yang membutuhkan, bukan menyebabkan penurunan nilai (hubungan observasional, bukan kausal).
  • Uji penurunan devians keseluruhan signifikan (p < 0.001), menunjukkan ketiga prediktor secara bersama berkontribusi nyata.

6 Regresi Poisson

Model IV — Data Hitung · absences (count 0–75)

6.1 Landasan Teori

Regresi Poisson digunakan untuk memodelkan variabel respons berupa data hitung (count data): \(Y_i \in \{0, 1, 2, \ldots\}\). Asumsi dasar: \(Y_i \mid \mathbf{x}_i \sim \text{Poisson}(\mu_i)\), dengan sifat equidispersion:

\[E(Y_i \mid \mathbf{x}_i) = \text{Var}(Y_i \mid \mathbf{x}_i) = \mu_i\]

Model menggunakan fungsi penghubung log:

\[\log(\mu_i) = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p\]

Koefisien diinterpretasikan melalui Incidence Rate Ratio (IRR):

\[\text{IRR}_j = \exp(\beta_j), \qquad \Delta\% = 100 \times (\text{IRR}_j - 1)\]

Jika setiap observasi memiliki periode pengamatan atau ukuran eksposur yang berbeda, model perlu menyertakan offset \(\log(t_i)\). Pada data ini, variabel absences diamati dalam periode akademik yang sama untuk seluruh siswa, sehingga offset tidak diperlukan.

Jika varians jauh melebihi mean (overdispersion), standar error Poisson akan bias ke bawah. Indikasi awal: rasio varians/mean jauh > 1.

6.2 Implementasi R

Variabel respons: absences. Prediktor: sex, age, Dalc, health.

# --- 4. REGRESI POISSON ---

# Cek equidispersion: mean vs varians
cat("Rata-rata absen:", round(mean(df$absences), 3), "\n")
Rata-rata absen: 3.659 
cat("Varians absen  :", round(var(df$absences), 3), "\n")
Varians absen  : 21.537 
cat("Rasio var/mean :", round(var(df$absences) / mean(df$absences), 3), "\n")
Rasio var/mean : 5.885 
# Fit model Poisson
fit_pois <- glm(absences ~ sex + age + Dalc + health,
                family = poisson(link = "log"),
                data   = df)
summary(fit_pois)

Call:
glm(formula = absences ~ sex + age + Dalc + health, family = poisson(link = "log"), 
    data = df)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.94070    0.27894  -3.372 0.000745 ***
sexM        -0.03866    0.04444  -0.870 0.384355    
age          0.12318    0.01631   7.552 4.27e-14 ***
Dalc         0.17633    0.01979   8.910  < 2e-16 ***
health      -0.02955    0.01421  -2.080 0.037515 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 3464.7  on 648  degrees of freedom
Residual deviance: 3301.3  on 644  degrees of freedom
AIC: 4684.5

Number of Fisher Scoring iterations: 6
# Incidence Rate Ratio beserta 95% CI
irr    <- exp(coef(fit_pois))
ci     <- exp(confint.default(fit_pois))
result <- cbind(IRR = irr, CI_low = ci[,1], CI_high = ci[,2],
                Delta_pct = 100 * (irr - 1))
cat("--- IRR dengan 95% CI ---\n")
--- IRR dengan 95% CI ---
print(round(result, 4))
               IRR CI_low CI_high Delta_pct
(Intercept) 0.3904 0.2260  0.6744  -60.9645
sexM        0.9621 0.8818  1.0496   -3.7918
age         1.1311 1.0955  1.1678   13.1085
Dalc        1.1928 1.1475  1.2400   19.2835
health      0.9709 0.9442  0.9983   -2.9116
# Koreksi overdispersion: quasi-Poisson
# SE quasi-Poisson = SE Poisson × sqrt(dispersion)
fit_qpois <- glm(absences ~ sex + age + Dalc + health,
                 family = quasipoisson(link = "log"),
                 data   = df)
cat("--- Perbandingan SE: Poisson vs quasi-Poisson ---\n")
--- Perbandingan SE: Poisson vs quasi-Poisson ---
se_compare <- data.frame(
  Poisson       = round(sqrt(diag(vcov(fit_pois))), 4),
  QuasiPoisson  = round(sqrt(diag(vcov(fit_qpois))), 4)
)
print(se_compare)
            Poisson QuasiPoisson
(Intercept)  0.2789       0.6545
sexM         0.0444       0.1043
age          0.0163       0.0383
Dalc         0.0198       0.0464
health       0.0142       0.0333
cat("\nDispersion parameter (quasi-Poisson):",
    round(summary(fit_qpois)$dispersion, 3), "\n")

Dispersion parameter (quasi-Poisson): 5.506 

6.3 Hasil & Interpretasi

Overdispersion: Rata-rata absensi ≈ 3.66, varians ≈ 21.54 → rasio varians/mean ≈ 5.89, jauh di atas 1. Ini menunjukkan overdispersion yang cukup berat. SE dari model Poisson standar kemungkinan terlalu kecil (z-value terlalu besar, p-value terlalu kecil). Sebagai koreksi, hasil quasi-Poisson dilaporkan berdampingan untuk perbandingan.

Tabel 5 — Koefisien, IRR, dan p-value Model Poisson (Y = absences)

Prediktor β̂ SE (Poisson) SE (quasi) z/t p-value (Poisson) IRR Δ%
(Intercept) −0.9407 0.2789 0.6780 −3.372 <0.001 *** 0.390
sex (M) −0.0387 0.0444 0.1080 −0.870 0.384 0.962 −3.8%
age 0.1232 0.0163 0.0396 7.552 <0.001 *** 1.131 +13.1%
Dalc 0.1763 0.0198 0.0481 8.910 <0.001 *** 1.193 +19.3%
health −0.0296 0.0142 0.0344 −2.080 0.038 * 0.971 −2.9%

SE quasi = SE Poisson × √dispersion. Dengan quasi-Poisson, beberapa prediktor yang tampak signifikan di Poisson standar bisa menjadi tidak signifikan.

Interpretasi Utama:

  • Dalc (IRR = 1.193, p < 0.001 pada Poisson): setiap kenaikan 1 level konsumsi alkohol harian meningkatkan rata-rata absensi sebesar +19.3%. Prediktor perilaku paling substantif.
  • age (IRR = 1.131): setiap bertambah 1 tahun usia, rata-rata absensi naik +13.1%. Siswa lebih tua cenderung lebih sering absen.
  • health (IRR = 0.971): kesehatan lebih baik dikaitkan dengan absensi lebih sedikit (−2.9%). Efek kecil namun signifikan.
  • sex(M): tidak signifikan (p = 0.384) — jenis kelamin tidak berpengaruh nyata setelah mengendalikan variabel lain.
  • Perlu diperhatikan: dengan koreksi quasi-Poisson, SE meningkat sekitar √5.89 ≈ 2.4 kali lipat. Kesimpulan tentang age dan Dalc kemungkinan tetap signifikan, namun health perlu diperiksa ulang.

7 Ringkasan Model

# AIC keempat model (ringkasan otomatis)
cat("AIC Biner      :", AIC(fit_biner), "\n")
AIC Biner      : 367.9082 
cat("AIC Multinomial:", AIC(fit_multi), "\n")
AIC Multinomial: 1540.307 
cat("AIC Ordinal    :", AIC(fit_ord),   "\n")
AIC Ordinal    : 1155.768 
cat("AIC Poisson    :", AIC(fit_pois),  "\n")
AIC Poisson    : 4684.469 

Tabel 6 — Perbandingan Keempat Model

Model Respons (Y) Link Prediktor Signifikan Temuan Kunci
Biner higher (yes/no) logit Medu, studytime, failures*** Kegagalan akademik paling menghambat keinginan kuliah (OR = 0.43)
Multinomial Mjob (5 kelas) logit Medu*** (semua); internet* (3 kategori) Ibu guru diprediksi kuat oleh Medu (RRR = 47.9 vs other)
Ordinal G3_level (3 ord.) logit PO studytime, failures, schoolsup** Failures menurunkan odds nilai tinggi menjadi 0.27×
Poisson absences (count) log age, Dalc, health* Alkohol +1 level → absensi naik +19.3%; perhatikan overdispersion

Across semua model, variabel failures (riwayat kegagalan akademik) secara konsisten menjadi prediktor negatif yang kuat — baik terhadap keinginan melanjutkan kuliah (Biner) maupun terhadap tingkatan nilai akhir (Ordinal). Sebaliknya, Medu (pendidikan ibu) dan studytime (waktu belajar) secara konsisten berhubungan positif dengan outcome akademik yang lebih baik.


8 Referensi

  1. Materi Kuliah S2 Statistika Terapan FMIPA UNPAD. (19 Mei 2026). Regresi Logistik Multinomial, Ordinal, dan Regresi Poisson.
  2. Materi Kuliah S2 Statistika Terapan FMIPA UNPAD. (24 Mei 2026). Model Log-Linear Dua Arah untuk Data Kategorik.