1 Deskripsi Data

Data berasal dari desain faktorial 2 × 2 dengan:

Simbol Keterangan
Faktor A 2 level: l1, l2
Faktor B 2 level: f1, f2
n 4 observasi per sel
p 3 variabel dependen: X1, X2, X3

2 Input Data

data <- data.frame(
  A = factor(rep(c("l1","l1","l2","l2"), each = 4)),
  B = factor(rep(c("f1","f2","f1","f2"), each = 4)),
  X1 = c(1.3, 1.2, 0.7, 1.3,   # A=l1, B=f1
         1.3, 1.4, 1.5, 1.7,   # A=l1, B=f2
         1.3, 1.5, 1.5, 1.8,   # A=l2, B=f1
         1.3, 1.4, 1.5, 1.6),  # A=l2, B=f2
  X2 = c(1.2, 1.1, 1.9, 2.1,
         1.3, 1.9, 1.2, 2.1,
         1.2, 1.7, 1.5, 2.1,
         1.7, 1.8, 1.9, 2.0),
  X3 = c(1.0, 1.3, 1.4, 1.5,
         0.2, 0.7, 0.9, 0.9,
         1.3, 2.1, 0.5, 1.3,
         1.9, 1.6, 1.8, 2.7)
)

knitr::kable(data, caption = "Data Two-Way MANOVA", align = "c")
Data Two-Way MANOVA
A B X1 X2 X3
l1 f1 1.3 1.2 1.0
l1 f1 1.2 1.1 1.3
l1 f1 0.7 1.9 1.4
l1 f1 1.3 2.1 1.5
l1 f2 1.3 1.3 0.2
l1 f2 1.4 1.9 0.7
l1 f2 1.5 1.2 0.9
l1 f2 1.7 2.1 0.9
l2 f1 1.3 1.2 1.3
l2 f1 1.5 1.7 2.1
l2 f1 1.5 1.5 0.5
l2 f1 1.8 2.1 1.3
l2 f2 1.3 1.7 1.9
l2 f2 1.4 1.8 1.6
l2 f2 1.5 1.9 1.8
l2 f2 1.6 2.0 2.7

3 Helper Function

# Fungsi menghitung SSCP matrix (sum of squares and cross products)
sscp <- function(mat) {
  centered <- scale(mat, scale = FALSE)
  t(centered) %*% centered
}

# Fungsi untuk membulatkan hanya kolom numerik dari hasil aggregate
round_agg <- function(df_agg, digits = 4) {
  num_cols <- sapply(df_agg, is.numeric)
  df_agg[, num_cols] <- round(df_agg[, num_cols], digits)
  return(df_agg)
}

4 Grand Mean & Marginal Means

Y       <- as.matrix(data[, c("X1","X2","X3")])
n_cell  <- 4   # observasi per sel
p       <- 3   # jumlah variabel dependen
g       <- 2   # level Faktor A
b       <- 2   # level Faktor B

grand_mean <- colMeans(Y)

Grand Mean:

Grand Mean (x̄)
X1 X2 X3
round(grand_mean, 4) 1.3938 1.6687 1.3188

Marginal Means Faktor A:

Marginal Means Faktor A
A X1 X2 X3
l1 1.3000 1.6000 0.9875
l2 1.4875 1.7375 1.6500

Marginal Means Faktor B:

Marginal Means Faktor B
B X1 X2 X3
f1 1.3250 1.6000 1.3000
f2 1.4625 1.7375 1.3375

Cell Means (A × B):

Cell Means (kombinasi A × B)
A B X1 X2 X3
l1 f1 1.125 1.575 1.300
l2 f1 1.525 1.625 1.300
l1 f2 1.475 1.625 0.675
l2 f2 1.450 1.850 2.000

5 SSP Total

\[ \text{SSP}_{\text{total}} = \sum_{\ell}\sum_{k}\sum_{r} (\mathbf{x}_{\ell kr} - \bar{\mathbf{x}})(\mathbf{x}_{\ell kr} - \bar{\mathbf{x}})^T \]

SSP_total <- sscp(Y)
SSP Total
X1 X2 X3
X1 0.9094 0.3669 0.1619
X2 0.3669 1.9944 1.3294
X3 0.1619 1.3294 5.9644

6 SSP Faktor A

\[ \text{SSP}_{\text{fak1}} = \sum_{\ell=1}^{g} bn\,(\bar{\mathbf{x}}_{\ell.} - \bar{\mathbf{x}})(\bar{\mathbf{x}}_{\ell.} - \bar{\mathbf{x}})^T \]

SSP_A <- matrix(0, p, p)
for (la in levels(data$A)) {
  idx  <- data$A == la
  ni   <- sum(idx)
  diff <- colMeans(Y[idx, ]) - grand_mean
  SSP_A <- SSP_A + ni * outer(diff, diff)
}
SSP Faktor A
X1 X2 X3
X1 0.1406 0.1031 0.4969
X2 0.1031 0.0756 0.3644
X3 0.4969 0.3644 1.7556

7 SSP Faktor B

\[ \text{SSP}_{\text{fak2}} = \sum_{k=1}^{b} gn\,(\bar{\mathbf{x}}_{.k} - \bar{\mathbf{x}})(\bar{\mathbf{x}}_{.k} - \bar{\mathbf{x}})^T \]

SSP_B <- matrix(0, p, p)
for (lb in levels(data$B)) {
  idx  <- data$B == lb
  ni   <- sum(idx)
  diff <- colMeans(Y[idx, ]) - grand_mean
  SSP_B <- SSP_B + ni * outer(diff, diff)
}
SSP Faktor B
X1 X2 X3
X1 0.0756 0.0756 0.0206
X2 0.0756 0.0756 0.0206
X3 0.0206 0.0206 0.0056

8 SSP Error (Within Cells)

\[ \text{SSP}_{\text{res}} = \sum_{\ell=1}^{g}\sum_{k=1}^{b}\sum_{r=1}^{n} (\mathbf{x}_{\ell kr} - \bar{\mathbf{x}}_{\ell k})(\mathbf{x}_{\ell kr} - \bar{\mathbf{x}}_{\ell k})^T \]

SSP_E <- matrix(0, p, p)
for (la in levels(data$A)) {
  for (lb in levels(data$B)) {
    idx   <- data$A == la & data$B == lb
    Ycell <- Y[idx, ]
    SSP_E <- SSP_E + sscp(Ycell)
  }
}
SSP Error (Residual)
X1 X2 X3
X1 0.5125 0.2625 0.2075
X2 0.2625 1.8125 0.7125
X3 0.2075 0.7125 2.4475

9 SSP Interaksi (A × B)

\[ \text{SSP}_{\text{int}} = \text{SSP}_{\text{total}} - \text{SSP}_{\text{fak1}} - \text{SSP}_{\text{fak2}} - \text{SSP}_{\text{res}} \]

SSP_AB <- SSP_total - SSP_A - SSP_B - SSP_E
SSP Interaksi (A × B)
X1 X2 X3
X1 0.1806 -0.0744 -0.5631
X2 -0.0744 0.0306 0.2319
X3 -0.5631 0.2319 1.7556

Verifikasi Dekomposisi:

check     <- SSP_A + SSP_B + SSP_AB + SSP_E
max_selisih <- max(abs(check - SSP_total))
cat("Max selisih (harus ~0):", max_selisih, "\n")
Max selisih (harus ~0): 8.326673e-17 

10 Degrees of Freedom

\[ gbn - 1 = (g-1) + (b-1) + (g-1)(b-1) + gb(n-1) \]

df_A  <- g - 1              # 1
df_B  <- b - 1              # 1
df_AB <- (g - 1) * (b - 1) # 1
df_E  <- g * b * (n_cell - 1) # 12
df_T  <- g * b * n_cell - 1   # 15
Degrees of Freedom
Sumber Formula df
Faktor A g − 1 1
Faktor B b − 1 1
Interaksi A×B (g−1)(b−1) 1
Error gb(n−1) 12
Total gbn − 1 15

11 Uji Wilks’ Lambda

11.1 Formula

\[ \Lambda^* = \frac{|\text{SSP}_{\text{res}}|}{|\text{SSP}_H + \text{SSP}_{\text{res}}|} \]

\[ F = \left(\frac{1 - \Lambda^*}{\Lambda^*}\right) \times \frac{(gb(n-1) - p + 1)/2}{(|df_H - p| + 1)/2} \]

11.2 Fungsi Wilks

wilks_test <- function(SSP_H, SSP_E, df_h, g, b, n, p, label) {

  lam <- det(SSP_E) / det(SSP_H + SSP_E)

  num_term <- (g * b * (n - 1) - p + 1) / 2
  den_term <- (abs(df_h - p) + 1) / 2
  F_stat   <- ((1 - lam) / lam) * (num_term / den_term)
  v1       <- abs(df_h - p) + 1
  v2       <- g * b * (n - 1) - p + 1
  p_val    <- pf(F_stat, v1, v2, lower.tail = FALSE)
  sig      <- ifelse(p_val < 0.001, "***",
               ifelse(p_val < 0.01,  "**",
                ifelse(p_val < 0.05,  "*", "ns")))

  list(label  = label,
       lambda = lam,
       F      = F_stat,
       v1     = v1,
       v2     = v2,
       pval   = p_val,
       sig    = sig)
}

11.3 Hasil Pengujian

res_A  <- wilks_test(SSP_A,  SSP_E, df_A,  g, b, n_cell, p, "Faktor A")
res_B  <- wilks_test(SSP_B,  SSP_E, df_B,  g, b, n_cell, p, "Faktor B")
res_AB <- wilks_test(SSP_AB, SSP_E, df_AB, g, b, n_cell, p, "Interaksi A×B")
Tabel MANOVA Uji Wilks’ Lambda
Sumber df Lambda F_hitung v1 v2 p_value Sig
Faktor A 1 0.5297 2.9598 3 10 0.084179 ns
Faktor B 1 0.8609 0.5388 3 10 0.666364 ns
Interaksi A×B 1 0.4346 4.3359 3 10 0.033497 *
Error 12 NA NA NA NA NA
Total 15 NA NA NA NA NA

Keterangan signifikansi: *** p < 0.001 | ** p < 0.01 | * p < 0.05 | ns tidak signifikan


12 Interpretasi Hasil

  • Faktor A: tidak signifikan (p = 0.0842, Λ = 0.5297)
  • Faktor B: tidak signifikan (p = 0.6664, Λ = 0.8609)
  • Interaksi A×B: signifikan (p = 0.0335, Λ = 0.4346)

13 Konfirmasi dengan Built-in manova() R

fit <- manova(cbind(X1, X2, X3) ~ A * B, data = data)
summary(fit, test = "Wilks")
          Df   Wilks approx F num Df den Df  Pr(>F)  
A          1 0.52968   2.9598      3     10 0.08418 .
B          1 0.86085   0.5388      3     10 0.66636  
A:B        1 0.43464   4.3359      3     10 0.03350 *
Residuals 12                                         
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

14 Ringkasan

Ringkasan Analisis
Komponen Nilai
Jumlah observasi 16
Faktor A (level) 2
Faktor B (level) 2
Variabel dependen (p) 3
Observasi per sel (n) 4
df Error 12