12.1 개요 (Introduction)

분산 분석을 하는 방법은 여러가지이다. 기본적으로는 두 변동(분산)의 비가 F 분포를 따름을 이용한 것이다. 이 때 분모는 대개 MSE (mean squared error)이지만, nested model과 같이 경우에 따라서는 다른 분산을 분모로 사용해야 한다.

R이나 대부분의 교과서는 SAS와 다른 방식으로 설명되어 있다.

여기서는 SAS를 기준으로 설명한다. R에서 SAS와 같은 결과를 얻고 싶으면 sasLM package를 사용한다.

ANOVA를 하기 위해서는 내부적으로 우선 regression을 해야 한다.

연속형(수치형, 정량형) 변수 하나는 \(\beta\) 계수 하나를 사용하지만, 범주형 변수는 자신이 가지는 level의 수보다 하나 작은 개수의 \(\beta\) 계수를 쓴다. 즉, 그만큼의 자유도를 소모한다.

추정된 \(\beta\) 계수와 contrast라 불리는 vector (또는 vector들이 쌓인 matrix)를 곱하여 sum of square (SS)를 구한다. 이 때 \(\beta\) 계수 추정시에 사용된 g2 inverse를 사용한다. (g2 inverse는 이후 설명)

SAS에서는 SS를 계산하기 위한 이 contrast vector (matrix)를 estimable function이라 부른다. 하지만, function이라는 용어가 일반적인 수학이나 프로그래밍을 주로 하는 사람에게는 혼란을 일으킬 것으로 보여 여기서는 계속 contrast라는 용어를 쓰기로 한다.

이때 contrast를 어떻게 구성하는가에 따라서, Type 1부터 Type 4까지의 SS가 산출된다.

다음은 contrast로 c(0, -1, 1)을 사용한 간단한 예이다.

anova(lm(uptake ~ Type, CO2))
Analysis of Variance Table

Response: uptake
          Df Sum Sq Mean Sq F value    Pr(>F)    
Type       1 3365.5  3365.5  43.519 3.835e-09 ***
Residuals 82 6341.4    77.3                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
require(sasLM)
rx = REG(uptake ~ Type, CO2, summarize=FALSE)
cSS(t(c(0, -1, 1)), rx)
  Df   Sum Sq  Mean Sq F value       Pr(>F)
1  1 3365.534 3365.534 43.5191 3.834686e-09

위의 두 결과가 동일함을 알 수 있다.

cSS 함수는 corrected sum of squares의 약어로서 다음에서 보듯이 비교적 간단한 함수임을 알 수 있다.

cSS = function(K, rx, mu = 0, eps=1e-8)
{
  b = rx$coefficients
  iiv = G2SWEEP(K %*% rx$g2 %*% t(K), Augmented=FALSE, eps=eps)
  Kb = K %*% b - mu
  Q = t(Kb) %*% iiv %*% Kb
  Df = attr(iiv, "rank")
  MS = ifelse(Df > 0, Q/Df, NA)
  if (rx$DFr > 0) {
    Fval = MS/(rx$SSE/rx$DFr)
    Pval = 1 - pf(Fval, Df, rx$DFr)
  } else {
    Fval = NA
    Pval = NA
  }
  Result = data.frame(Df, Q, MS, Fval, Pval)
  colnames(Result) = c("Df", "Sum Sq", "Mean Sq", "F value", "Pr(>F)")
  return(Result)
}

위에서 G2SWEEP 함수가 g2 inverse를 구하는 함수이다. 이 또한 생각보다 간단하다.