1. Pendahuluan

Analisis model loglinear digunakan untuk memodelkan hubungan antar variabel kategorikal dalam tabel kontingensi. Studi ini menguji hubungan antara tingkat stres (Ringan, Sedang, Berat) dan kejadian insomnia (Insomnia, Tidak Insomnia).

Model loglinear dinyatakan sebagai:

\[\log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY}\]

Di mana:

  • \(\mu_{ij}\) = frekuensi harapan sel \((i,j)\)
  • \(\lambda\) = grand mean (intercept)
  • \(\lambda_i^X\) = efek utama baris (Stres)
  • \(\lambda_j^Y\) = efek utama kolom (Insomnia)
  • \(\lambda_{ij}^{XY}\) = efek interaksi

2. Input Data

# Load package yang dibutuhkan
library(MASS)   # untuk loglm()
library(knitr)  # untuk tabel yang rapi

# Membuat tabel kontingensi sebagai 'table' object
# PENTING: loglm() butuh objek 'table' dengan nama dimensi yang eksplisit
data <- as.table(matrix(
  c(8, 14,
    40,  4,
    14,  4),
  nrow = 3,
  byrow = TRUE,
  dimnames = list(
    Stres    = c("Ringan", "Sedang", "Berat"),
    Insomnia = c("Insomnia", "Tidak Insomnia")
  )
))

# Tampilkan tabel data observasi
kable(data, caption = "Tabel Kontingensi: Tingkat Stres vs Insomnia")
Tabel Kontingensi: Tingkat Stres vs Insomnia
Insomnia Tidak Insomnia
Ringan 8 14
Sedang 40 4
Berat 14 4
# Tampilkan dengan margin total
addmargins(data)
#>         Insomnia
#> Stres    Insomnia Tidak Insomnia Sum
#>   Ringan        8             14  22
#>   Sedang       40              4  44
#>   Berat        14              4  18
#>   Sum          62             22  84

3. Model Independen (Tanpa Interaksi)

Model independen mengasumsikan tidak ada hubungan antara Stres dan Insomnia:

\[\log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y\]

# Fit model independen
model_indep <- loglm(~ Stres + Insomnia, data = data)
summary(model_indep)
#> Formula:
#> ~Stres + Insomnia
#> attr(,"variables")
#> list(Stres, Insomnia)
#> attr(,"factors")
#>          Stres Insomnia
#> Stres        1        0
#> Insomnia     0        1
#> attr(,"term.labels")
#> [1] "Stres"    "Insomnia"
#> attr(,"order")
#> [1] 1 1
#> attr(,"intercept")
#> [1] 1
#> attr(,"response")
#> [1] 0
#> attr(,".Environment")
#> <environment: R_GlobalEnv>
#> 
#> Statistics:
#>                       X^2 df     P(> X^2)
#> Likelihood Ratio 21.88809  2 1.766286e-05
#> Pearson          22.75980  2 1.142281e-05
# Frekuensi harapan (expected values) model independen
cat("=== Frekuensi Harapan - Model Independen ===\n")
#> === Frekuensi Harapan - Model Independen ===
kable(
  round(fitted(model_indep), 4),
  caption = "Nilai Expected (µij) - Model Independen"
)
#> Re-fitting to get fitted values
Nilai Expected (µij) - Model Independen
Insomnia Tidak Insomnia
Ringan 16.2381 5.7619
Sedang 32.4762 11.5238
Berat 13.2857 4.7143

4. Model Jenuh (Dengan Interaksi)

Model jenuh menyertakan efek interaksi antara Stres dan Insomnia:

\[\log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY}\]

# Fit model jenuh
model_jenuh <- loglm(~ Stres * Insomnia, data = data)
summary(model_jenuh)
#> Formula:
#> ~Stres * Insomnia
#> attr(,"variables")
#> list(Stres, Insomnia)
#> attr(,"factors")
#>          Stres Insomnia Stres:Insomnia
#> Stres        1        0              1
#> Insomnia     0        1              1
#> attr(,"term.labels")
#> [1] "Stres"          "Insomnia"       "Stres:Insomnia"
#> attr(,"order")
#> [1] 1 1 2
#> attr(,"intercept")
#> [1] 1
#> attr(,"response")
#> [1] 0
#> attr(,".Environment")
#> <environment: R_GlobalEnv>
#> 
#> Statistics:
#>                  X^2 df P(> X^2)
#> Likelihood Ratio   0  0        1
#> Pearson            0  0        1
# Frekuensi harapan model jenuh (harus = data observasi)
cat("=== Frekuensi Harapan - Model Jenuh ===\n")
#> === Frekuensi Harapan - Model Jenuh ===
kable(
  round(fitted(model_jenuh), 4),
  caption = "Nilai Expected (µij) - Model Jenuh (= Data Observasi)"
)
#> Re-fitting to get fitted values
Nilai Expected (µij) - Model Jenuh (= Data Observasi)
Insomnia Tidak Insomnia
Ringan 8 14
Sedang 40 4
Berat 14 4

Catatan: Pada model jenuh, nilai expected sama persis dengan data observasi (perfect fit).


5. Perbandingan: Observed vs Expected

# Susun tabel perbandingan
observed  <- as.vector(data)
expected_indep <- as.vector(round(fitted(model_indep), 4))
#> Re-fitting to get fitted values
expected_jenuh <- as.vector(round(fitted(model_jenuh), 4))
#> Re-fitting to get fitted values
sel_label <- paste0(
  rep(rownames(data), times = ncol(data)), "-",
  rep(colnames(data), each = nrow(data))
)

tabel_banding <- data.frame(
  Sel            = sel_label,
  Observed       = observed,
  Expected_Indep = expected_indep,
  Expected_Jenuh = expected_jenuh,
  Residual       = round(observed - expected_indep, 4)
)

kable(
  tabel_banding,
  col.names = c("Sel (i,j)", "Observed", "Expected (Independen)",
                "Expected (Jenuh)", "Residual"),
  caption = "Perbandingan Frekuensi Observasi dan Harapan"
)
Perbandingan Frekuensi Observasi dan Harapan
Sel (i,j) Observed Expected (Independen) Expected (Jenuh) Residual
Ringan-Insomnia 8 16.2381 8 -8.2381
Sedang-Insomnia 40 32.4762 40 7.5238
Berat-Insomnia 14 13.2857 14 0.7143
Ringan-Tidak Insomnia 14 5.7619 14 8.2381
Sedang-Tidak Insomnia 4 11.5238 4 -7.5238
Berat-Tidak Insomnia 4 4.7143 4 -0.7143