1 Pendahuluan

Eksperimen ini bertujuan mengetahui pengaruh dua faktor terhadap respons Current (dalam satuan microamps), yaitu:

  • Glass Type (2 level): Faktor acak (random effect) — level yang digunakan dianggap sebagai sampel acak dari populasi yang lebih besar. Inferensi berlaku untuk seluruh populasi Glass Type, bukan hanya dua level yang teramati.
  • Phosphor Type (3 level): Faktor tetap (fixed effect) — level dipilih secara spesifik; kesimpulan hanya berlaku untuk ketiga level tersebut.

Karena ada satu faktor acak dan satu faktor tetap, model yang tepat adalah Two-Way Mixed Model ANOVA. Dalam model ini, efek tetap (Phosphor Type) diuji menggunakan Mean Square interaksi sebagai penyebut, bukan MSE dalam sel — hal ini krusial agar pengujian hipotesis valid.


2 Persiapan Data

2.1 Input Data dalam Format Tidy (Long Format)

library(tidyverse)
library(car)
library(knitr)
library(kableExtra)

# Input data dalam format tidy (long format)
data_raw <- tibble(
  Glass    = factor(rep(c(1, 1, 1, 2, 2, 2), times = 3)),
  Phosphor = factor(rep(c("P1", "P2", "P3"), each = 6)),
  Current  = c(
    280, 290, 285,   # Glass 1, Phosphor 1
    230, 235, 240,   # Glass 2, Phosphor 1
    300, 310, 295,   # Glass 1, Phosphor 2
    260, 240, 235,   # Glass 2, Phosphor 2
    290, 285, 290,   # Glass 1, Phosphor 3
    220, 225, 230    # Glass 2, Phosphor 3
  )
)

data_raw %>%
  kable(
    caption   = "**Tabel 1.** Data Eksperimen dalam Format *Tidy* (Long Format)",
    col.names = c("*Glass Type*", "*Phosphor Type*", "*Current* (µA)")
  ) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabel 1. Data Eksperimen dalam Format Tidy (Long Format)
Glass Type Phosphor Type Current (µA)
1 P1 280
1 P1 290
1 P1 285
2 P1 230
2 P1 235
2 P1 240
1 P2 300
1 P2 310
1 P2 295
2 P2 260
2 P2 240
2 P2 235
1 P3 290
1 P3 285
1 P3 290
2 P3 220
2 P3 225
2 P3 230

2.2 Statistik Deskriptif

data_raw %>%
  group_by(Glass, Phosphor) %>%
  summarise(
    N    = n(),
    Mean = round(mean(Current), 2),
    SD   = round(sd(Current), 2),
    Min  = min(Current),
    Max  = max(Current),
    .groups = "drop"
  ) %>%
  kable(
    caption   = "**Tabel 2.** Statistik Deskriptif per Kombinasi *Glass Type* x *Phosphor Type*",
    col.names = c("*Glass Type*", "*Phosphor Type*", "N", "Mean (µA)", "SD (µA)", "Min", "Max")
  ) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Tabel 2. Statistik Deskriptif per Kombinasi Glass Type x Phosphor Type
Glass Type Phosphor Type N Mean (µA) SD (µA) Min Max
1 P1 3 285.00 5.00 280 290
1 P2 3 301.67 7.64 295 310
1 P3 3 288.33 2.89 285 290
2 P1 3 235.00 5.00 230 240
2 P2 3 245.00 13.23 235 260
2 P3 3 225.00 5.00 220 230

3 Analisis (a): Two-Way ANOVA – Mixed Model

3.1 Spesifikasi Model

Model statistik yang digunakan adalah:

\[Y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \varepsilon_{ijk}\]

di mana:

  • \(Y_{ijk}\) = pengamatan ke-\(k\) pada Glass Type ke-\(i\) dan Phosphor Type ke-\(j\)
  • \(\mu\) = grand mean
  • \(\alpha_i\) = efek acak Glass Type, \(\alpha_i \sim N(0, \sigma^2_\alpha)\)
  • \(\beta_j\) = efek tetap Phosphor Type
  • \((\alpha\beta)_{ij}\) = efek interaksi
  • \(\varepsilon_{ijk}\) = galat acak, \(\varepsilon_{ijk} \sim N(0, \sigma^2)\)

3.2 Fitting Model

Fungsi aov() dengan spesifikasi Error(Glass/Phosphor) digunakan untuk mendefinisikan struktur error yang sesuai dengan mixed model.

model_mixed <- aov(Current ~ Phosphor + Error(Glass/Phosphor), data = data_raw)
summary(model_mixed)
## 
## Error: Glass
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals  1  14450   14450               
## 
## Error: Glass:Phosphor
##           Df Sum Sq Mean Sq F value Pr(>F)
## Phosphor   2  933.3   466.7       7  0.125
## Residuals  2  133.3    66.7               
## 
## Error: Within
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 12  633.3   52.78

3.3 Konstruksi Tabel ANOVA

ss <- summary(model_mixed)

# Ekstrak masing-masing stratum:
# "Error: Glass"          -> efek Glass (random, tanpa F-test formal)
# "Error: Glass:Phosphor" -> Phosphor (fixed) dan interaksi (Residuals di stratum ini)
# "Error: Within"         -> galat dalam sel
ss_glass  <- ss[["Error: Glass"]][[1]]
ss_gp     <- ss[["Error: Glass:Phosphor"]][[1]]
ss_within <- ss[["Error: Within"]][[1]]

# Phosphor diuji dengan MS interaksi (bukan MS galat) -- sesuai mixed model
f_phosphor <- ss_gp["Phosphor", "F value"]
p_phosphor <- ss_gp["Phosphor", "Pr(>F)"]
ms_interaksi <- ss_gp["Residuals", "Mean Sq"]

tabel_anova <- tibble(
  `Sumber Variasi` = c(
    "Glass Type (Random)",
    "Phosphor Type (Fixed)",
    "Interaksi Glass x Phosphor",
    "Galat (Dalam Sel)"
  ),
  df = c(
    ss_glass["Residuals",  "Df"],
    ss_gp["Phosphor",      "Df"],
    ss_gp["Residuals",     "Df"],
    ss_within["Residuals", "Df"]
  ),
  SS = round(c(
    ss_glass["Residuals",  "Sum Sq"],
    ss_gp["Phosphor",      "Sum Sq"],
    ss_gp["Residuals",     "Sum Sq"],
    ss_within["Residuals", "Sum Sq"]
  ), 2),
  MS = round(c(
    ss_glass["Residuals",  "Mean Sq"],
    ss_gp["Phosphor",      "Mean Sq"],
    ss_gp["Residuals",     "Mean Sq"],
    ss_within["Residuals", "Mean Sq"]
  ), 2),
  `F-value` = c("--", round(f_phosphor, 4), "--", "--"),
  `p-value` = c("--", round(p_phosphor,  4), "--", "--")
)

tabel_anova %>%
  kable(
    caption = "**Tabel 3.** Tabel ANOVA Two-Way *Mixed Model*",
    escape  = FALSE
  ) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = TRUE) %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(2, background = "#eaf4fb") %>%
  footnote(
    general = paste0(
      "Efek Phosphor Type diuji menggunakan MS Interaksi (MS = ",
      round(ms_interaksi, 2),
      ") sebagai penyebut, sesuai ekspektasi Mean Square pada mixed model."
    ),
    escape = FALSE
  )
Tabel 3. Tabel ANOVA Two-Way Mixed Model
Sumber Variasi df SS MS F-value p-value
Glass Type (Random) 1 14450.00 14450.00
Phosphor Type (Fixed) 2 933.33 466.67 7 0.125
Interaksi Glass x Phosphor 2 133.33 66.67
Galat (Dalam Sel) 12 633.33 52.78
Note:
Efek Phosphor Type diuji menggunakan MS Interaksi (MS = 66.67) sebagai penyebut, sesuai ekspektasi Mean Square pada mixed model.

3.4 Pengujian Hipotesis

ms_phosphor <- ss_gp["Phosphor", "Mean Sq"]

cat("============================================\n")
## ============================================
cat("  Uji Efek Phosphor Type\n")
##   Uji Efek Phosphor Type
cat("  H0: Semua level Phosphor memberikan\n")
##   H0: Semua level Phosphor memberikan
cat("      rata-rata Current yang sama\n")
##       rata-rata Current yang sama
cat("  H1: Minimal satu level berbeda\n")
##   H1: Minimal satu level berbeda
cat("--------------------------------------------\n")
## --------------------------------------------
cat(sprintf("  MS Phosphor  = %.2f\n", ms_phosphor))
##   MS Phosphor  = 466.67
cat(sprintf("  MS Interaksi = %.2f  <- penyebut F\n", ms_interaksi))
##   MS Interaksi = 66.67  <- penyebut F
cat(sprintf("  F-value      = %.4f\n", f_phosphor))
##   F-value      = 7.0000
cat(sprintf("  p-value      = %.4f\n", p_phosphor))
##   p-value      = 0.1250
cat(sprintf("  Keputusan    : %s\n",
    ifelse(p_phosphor < 0.05,
           "Tolak H0 --> Phosphor Type BERPENGARUH SIGNIFIKAN",
           "Gagal Tolak H0 --> Phosphor Type tidak signifikan")))
##   Keputusan    : Gagal Tolak H0 --> Phosphor Type tidak signifikan
cat("============================================\n")
## ============================================

3.5 Visualisasi: Interaction Plot

data_raw %>%
  group_by(Glass, Phosphor) %>%
  summarise(Mean_Current = mean(Current), .groups = "drop") %>%
  ggplot(aes(x = Phosphor, y = Mean_Current,
             color = Glass, group = Glass, shape = Glass)) +
  geom_line(linewidth = 1.3) +
  geom_point(size = 5) +
  geom_text(aes(label = round(Mean_Current, 1)),
            vjust = -1.2, size = 3.5, show.legend = FALSE) +
  scale_color_manual(
    values = c("#2980b9", "#e74c3c"),
    labels = c("Glass Type 1", "Glass Type 2")
  ) +
  scale_shape_manual(
    values = c(16, 17),
    labels = c("Glass Type 1", "Glass Type 2")
  ) +
  expand_limits(y = c(195, 340)) +
  labs(
    title = "Interaction Plot: Glass Type x Phosphor Type",
    x     = "Phosphor Type",
    y     = "Rata-rata Current (µA)",
    color = "Glass Type",
    shape = "Glass Type"
  ) +
  theme_bw(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", hjust = 0.5),
    legend.position = "top"
  )
**Gambar 1.** Interaction Plot antara Glass Type dan Phosphor Type terhadap rata-rata Current (µA). Garis yang tidak sejajar mengindikasikan adanya interaksi antar kedua faktor.

Gambar 1. Interaction Plot antara Glass Type dan Phosphor Type terhadap rata-rata Current (µA). Garis yang tidak sejajar mengindikasikan adanya interaksi antar kedua faktor.

3.6 Interpretasi Analisis (a)

Mengapa Mixed Model? Dalam mixed model, efek tetap (Phosphor Type) diuji menggunakan MS interaksi sebagai penyebut – bukan MS galat dalam sel. Hal ini karena Glass Type adalah faktor acak: interaksi menjadi sumber variabilitas yang relevan untuk mengukur konsistensi efek Phosphor lintas populasi Glass Type.

Efek Phosphor Type (F = 7, p = 0.125): Karena p-value = 0.125 >= 0,05, pada alpha = 0,05 tidak terdapat pengaruh yang signifikan dari Phosphor Type terhadap Current..

Pola Interaction Plot (Gambar 1): Kedua garis (Glass Type 1 dan Glass Type 2) berjalan relatif sejajar, menunjukkan bahwa pola pengaruh Phosphor Type cukup konsisten di kedua level Glass – meskipun Current pada Glass Type 1 secara keseluruhan lebih tinggi. Interaksi yang terbatas ini mendukung validitas interpretasi efek utama Phosphor Type.


4 Analisis (b): Uji Asumsi Residual

4.1 Ekstraksi Residual

Untuk keperluan diagnostik, model lm() dengan interaksi penuh digunakan agar residual dapat diekstrak dengan mudah. Model ini ekivalen secara dekomposisi SS.

model_lm <- lm(Current ~ Glass * Phosphor, data = data_raw)

data_diag <- data_raw %>%
  mutate(
    Fitted   = fitted(model_lm),
    Residual = residuals(model_lm)
  )

4.2 Uji Normalitas Residual

4.2.1 Q-Q Plot

ggplot(data_diag, aes(sample = Residual)) +
  stat_qq(color = "#2980b9", size = 3.5, alpha = 0.85) +
  stat_qq_line(color = "#e74c3c", linewidth = 1.2, linetype = "dashed") +
  labs(
    title = "Normal Q-Q Plot Residual",
    x     = "Kuantil Teoretis",
    y     = "Kuantil Sampel (Residual)"
  ) +
  theme_bw(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
**Gambar 2.** Normal Q-Q Plot Residual. Titik-titik yang mengikuti garis diagonal merah (putus-putus) menunjukkan residual berdistribusi normal. Penyimpangan di bagian ekor mengindikasikan ketidaknormalan.

Gambar 2. Normal Q-Q Plot Residual. Titik-titik yang mengikuti garis diagonal merah (putus-putus) menunjukkan residual berdistribusi normal. Penyimpangan di bagian ekor mengindikasikan ketidaknormalan.

4.2.2 Uji Shapiro-Wilk

sw <- shapiro.test(residuals(model_lm))

cat("=== Uji Normalitas Shapiro-Wilk ===\n")
## === Uji Normalitas Shapiro-Wilk ===
cat(sprintf("W  = %.4f\n", sw$statistic))
## W  = 0.9525
cat(sprintf("p  = %.4f\n", sw$p.value))
## p  = 0.4655
cat(sprintf(">> %s\n",
    ifelse(sw$p.value > 0.05,
           "Gagal Tolak H0 --> Residual BERDISTRIBUSI NORMAL",
           "Tolak H0 --> Residual TIDAK berdistribusi normal")))
## >> Gagal Tolak H0 --> Residual BERDISTRIBUSI NORMAL

Interpretasi: Uji Shapiro-Wilk menghasilkan W = 0.9525 dengan p-value = 0.4655. Karena p-value > 0,05, asumsi normalitas residual terpenuhi. Hasil ini konsisten dengan Q-Q plot (Gambar 2) yang menunjukkan titik-titik mengikuti garis diagonal dengan baik..


4.3 Uji Homogenitas Varians

4.3.1 Plot Residual vs. Fitted

ggplot(data_diag, aes(x = Fitted, y = Residual)) +
  geom_hline(yintercept = 0, color = "#e74c3c",
             linewidth = 1.1, linetype = "dashed") +
  geom_point(color = "#2980b9", size = 4, alpha = 0.85) +
  labs(
    title = "Plot Residual vs. Nilai Fitted",
    x     = "Nilai Fitted (Prediksi)",
    y     = "Residual"
  ) +
  theme_bw(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
**Gambar 3.** Plot Residual terhadap Nilai Fitted. Sebaran yang merata dan acak di sekitar garis nol tanpa pola corong mengindikasikan homogenitas varians terpenuhi.

Gambar 3. Plot Residual terhadap Nilai Fitted. Sebaran yang merata dan acak di sekitar garis nol tanpa pola corong mengindikasikan homogenitas varians terpenuhi.

4.3.2 Uji Levene

data_diag <- data_diag %>%
  mutate(Grup = interaction(Glass, Phosphor))

lev   <- leveneTest(Current ~ Grup, data = data_diag)
p_lev <- lev$`Pr(>F)`[1]

cat("=== Uji Homogenitas Varians (Levene's Test) ===\n")
## === Uji Homogenitas Varians (Levene's Test) ===
print(lev)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  5    0.57  0.722
##       12
cat(sprintf("\n>> %s\n",
    ifelse(p_lev > 0.05,
           "Gagal Tolak H0 --> Varians HOMOGEN antar kelompok",
           "Tolak H0 --> Varians TIDAK homogen")))
## 
## >> Gagal Tolak H0 --> Varians HOMOGEN antar kelompok

Interpretasi: Uji Levene menghasilkan p-value = 0.722. Karena p-value > 0,05, asumsi homogenitas varians terpenuhi. Tidak terdapat bukti bahwa varians antar kombinasi Glass Type x Phosphor Type berbeda secara signifikan. Temuan ini konsisten dengan plot Residual vs. Fitted (Gambar 3) yang menunjukkan sebaran residual cukup merata tanpa pola yang mengkhawatirkan..


5 Kesimpulan

Tabel 4. Ringkasan Hasil Analisis dan Uji Asumsi
Aspek Statistik Keputusan (alpha = 0,05)
Efek Phosphor Type (Fixed) F = 7.0000, p = 0.1250 Tidak Signifikan
Asumsi Normalitas Residual (Shapiro-Wilk) W = 0.9525, p = 0.4655 Terpenuhi
Asumsi Homogenitas Varians (Levene) p = 0.7220 Terpenuhi

Model: Two-Way Mixed Model ANOVA diterapkan karena Glass Type merupakan faktor acak dan Phosphor Type merupakan faktor tetap. Efek Phosphor Type diuji menggunakan MS interaksi sebagai penyebut, menghasilkan inferensi yang berlaku umum ke populasi Glass Type.

Efek Phosphor Type: Tidak terdapat pengaruh signifikan Phosphor Type terhadap Current (p >= 0,05).

Uji Asumsi: Kedua asumsi model (normalitas residual dan homogenitas varians) terpenuhi pada alpha = 0,05. Hasil pengujian hipotesis dapat diandalkan.


Dokumen ini dibuat menggunakan R Markdown dan bersifat sepenuhnya reprodusibel.