An Analysis of Covariance Example
Whiteside 자료
1960년대에 영국 건축 연구소(UK Building Research Station)의 데릭 화이트사이드(Derek Whiteside)가 수집한 자료 (Hand et al., 1994 ).
잉글랜드 남동부에 있는 화이트사이드의 집에서 캐비티 벽 단열재를 설치하기 전과 후의 두 번의 “난방 시즌” 동안 주간 가스 소비량과 평균 외부 기온을 기록
실험 목적: 단열재가 가스 소비에 미치는 영향을 평가
# A tibble: 56 × 3
Insul Temp Gas
<fct> <dbl> <dbl>
1 Before -0.8 7.2
2 Before -0.7 6.9
3 Before 0.4 6.4
4 Before 2.5 6
5 Before 2.9 5.8
6 Before 3.2 5.8
7 Before 3.6 5.6
8 Before 3.9 4.7
9 Before 4.2 5.8
10 Before 4.3 5.2
# ℹ 46 more rows
Insul
: Before
와 After
의 두 수준을 갖는 요인 변수
Temp
: 섭씨 단위의 주간 평균 외부 기온
Gas
: 1,000 입방피트 단위의 주간 가스 소비량
먼저 자료를 단열재 설치 전과 후로 나누어 두 개의 패널에 최소제곱 직선을 함께 그려 보자.
ggplot (data= MASS:: whiteside, aes (x= Temp, y= Gas), facets= ~ Insul) +
stat_smooth (method = "lm" ) +
geom_point () +
facet_wrap (~ Insul) +
labs (x = "Average external temperature (deg. C)" ,
y = "Gas consumption (1000 cubic feet)" )
주어진 온도 범위 내에서는 직선 모형이 적절한 것으로 보인다.
그래프로 미루어 볼 때, 단열재가 동일한 외부 온도에서 가스 소비량을 줄이지만 직선의 기울기, 즉 외부 온도가 떨어질수록 가스 소비량이 증가하는 속도에도 영향을 미치는 것으로 보인다.
선형모형과 lm()
이러한 문제를 정량적으로 탐색하기 위해 lm
을 기본 함수로 하는 선형 모형을 적용한다.
lm (formula, data, subset, weights, na.action)
formula
: 윌킨슨-로저스 모형 공식 (유일한 필수 인수)
data
: 데이터 프레임 (선택 사항)
weights
: 양의 가중치 벡터 (균등하지 않은 가중치가 필요한 경우)
subset
: 사용할 데이터의 하위 집합을 지정하는 인덱스 벡터 (기본적으로 모든 항목이 사용됨)
na.action
: 결측치를 처리하는 방법을 지정하는 함수 (기본값은 na.omit
, 즉 생략. 적합치에 NA
가 포함되어야 하는 경우는 na.exclude
사용)
그래프의 직선을 각각 적합하기 위해 아래와 같이 lm
을 사용할 수 있다.
gasB <- lm (Gas ~ Temp, data = MASS:: whiteside, subset = Insul == "Before" )
# gasB <- lm(Gas ~ 1+Temp, data = MASS::whiteside, subset = Insul == "Before") # same result as above
gasA <- update (gasB, subset = Insul == "After" ) # modify the fitted model
적합된 모형 객체는 lm
클래스에 속한다. 객체에 대한 추가 작업을 수행하는 generic 함수는 다음과 같다.
print
: 간단한 출력
summary
: 통상적인 회귀분석 결과 출력,
coef
(or coefficients
): 회귀계수 추출
resid
(or residuals
): 잔차 추출
fitted
(or fitted.values
): 적합치 추출
deviance
: 잔차제곱합 추출
anova
: 분산표를 순차적 분석 또는 여러 계층적 모형을 비교
predict
: 새로운 데이터에 대한 평균 예측, 선택적으로 표준 오차 포함
plot
: 진단 플롯
lm
객체
분석 결과 요약
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.85383 0.11842 57.88 <2e-16 ***
## Temp -0.39324 0.01959 -20.08 <2e-16 ***
## ---
##
## Residual standard error: 0.2813 on 24 degrees of freedom
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.72385 0.12974 36.41 < 2e-16 ***
## Temp -0.27793 0.02518 -11.04 1.05e-11 ***
## ---
##
## Residual standard error: 0.3548 on 28 degrees of freedom
표본 분산
(varB <- deviance (gasB) / gasB$ df.resid) # direct calculation
(varB <- summary (gasB)$ sigma^ 2 ) # alternative
gasBA <- lm (Gas ~ Insul / Temp - 1 , data = MASS:: whiteside)
summary (gasBA)
Call:
lm(formula = Gas ~ Insul/Temp - 1, data = MASS::whiteside)
Residuals:
Min 1Q Median 3Q Max
-0.97802 -0.18011 0.03757 0.20930 0.63803
Coefficients:
Estimate Std. Error t value Pr(>|t|)
InsulBefore 6.85383 0.13596 50.41 <2e-16 ***
InsulAfter 4.72385 0.11810 40.00 <2e-16 ***
InsulBefore:Temp -0.39324 0.02249 -17.49 <2e-16 ***
InsulAfter:Temp -0.27793 0.02292 -12.12 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.323 on 52 degrees of freedom
Multiple R-squared: 0.9946, Adjusted R-squared: 0.9942
F-statistic: 2391 on 4 and 52 DF, p-value: < 2.2e-16
이차식 회귀
gasQ <- lm (Gas ~ Insul/ (Temp + I (Temp^ 2 )) - 1 , data = MASS:: whiteside)
summary (gasQ)$ coef
Estimate Std. Error t value Pr(>|t|)
InsulBefore 6.759215179 0.150786777 44.826312 4.854615e-42
InsulAfter 4.496373920 0.160667904 27.985514 3.302572e-32
InsulBefore:Temp -0.317658735 0.062965170 -5.044991 6.362323e-06
InsulAfter:Temp -0.137901603 0.073058019 -1.887563 6.489554e-02
InsulBefore:I(Temp^2) -0.008472572 0.006624737 -1.278930 2.068259e-01
InsulAfter:I(Temp^2) -0.014979455 0.007447107 -2.011446 4.968398e-02
분산분석
더 간단한 모형으로 기울기가 같은 회귀모형을 생각할 수 있다.
이 모형을 적합하고 anova
함수를 사용하여 수준별 기울기를 갖는 회귀 모형 내에서 검정할 수 있다. (왜 그런가?)
# MASS p. 143
gasPR <- lm (Gas ~ Insul + Temp, data = MASS:: whiteside)
anova (gasPR, gasBA)
Analysis of Variance Table
Model 1: Gas ~ Insul + Temp
Model 2: Gas ~ Insul/Temp - 1
Res.Df RSS Df Sum of Sq F Pr(>F)
1 53 6.7704
2 52 5.4252 1 1.3451 12.893 0.0007307 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
모형 공식
선형 모형은 응답 벡터 \(\boldsymbol{y}\) 와 설명 변수 행렬 또는 모형 행렬 \(X\) 로 결정된다.
모형 공식은 좌변에 응답변수를, 우변에는 특정 규칙에 따라 모형 행렬을 생성하는 방법에 대한 지시사항을 적는다.
예제: 3변수 다중선형모형
모형 공식
y ~ x1 + x2 + x3
대수적 기술
\[
y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \beta_3 x_{i3} + \epsilon_i,
\quad
i= 1, 2, \dotsc, n
\]
모형 행렬
\[
X = [\mathbf{1} ~ \mathbf{x}_1 ~ \mathbf{x}_2 ~ \mathbf{x}_3]
\]
절편 \(\beta_0\) 는 모형공식에서 암묵적으로 가정된다 (y ~ 1 + x1 + x2 + x3
).
y ~ x1 + x2 + x3 - 1
로 절편을 제거할 수 있다.
예제: 1원배치 모형
설명변수 a
가 \(k\) 개 수준을 갖는 범주형 변수 (factor
).
대수적 기술
\[
y_{ij} = \mu + \alpha_j + \epsilon_{ij},
\quad
i=1,2,\dotsc,n_j;
~
j=1,2,\dotsc, k;
~
n = \sum_j n_j
\]
벡터형식 및 모형행렬
\[
\begin{split}
\mathbf{y} &= X\boldsymbol{\beta} + \boldsymbol{\epsilon},
\\
\boldsymbol{\beta} &= [\mu, \alpha_1, \alpha_2, \dotsc, \alpha_k]^T = [\mu, \boldsymbol{\alpha}^T]^T,
\\
\mathbf{y} &= [y_{11}, \dotsc, y_{n_1,1}, \dotsc, y_{1k}, \dotsc, y_{n_k,k}]^T,
\\
X &= [\mathbf{1} ~ X_a],
\end{split}
\]
\(X_a\) 는 \(n\times k\) 행렬로 각 행 이 a
의 소속 수준에 해당하는 열에만 1이 있는 벡터(dummy variable, one-hot vector)로 구성된 이진행렬 (\(n = \underset{j=1} { \stackrel{k}{\sum} } n_j\) ).
예: \(n_1=2\) , \(n_2=1=n_3\) , \(k=3\) \[
X_a = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}
\]
\[
X_a = \begin{bmatrix} \mathbf{1}_{n_1} & O & \cdots & O \\ O & \mathbf{1}_{n_2} & \ddots & \vdots \\ \vdots & \ddots & \ddots & O \\ O & \cdots & O & \mathbf{1}_{n_k}\end{bmatrix}
\]
식별가능 모형 1: 제약식
\[
y_{ij} = \alpha_j + \epsilon_{ij},
\quad
i=1,2,\dotsc,n_j;
~
j=1,2,\dotsc, k
\] 즉, \(\beta_0 = \mu = 0\) 으로 제약. 벡터형식: \(\mathbf{e}_1^T \boldsymbol{\beta} = 0\) ; \(\mathbf{e}_1 = [1, 0, \dotsc, 0]^T\) .
모형행렬? 랭크?
모형 공식: y ~ a - 1
set.seed (2024-03-01 )
dat <- data.frame (a = factor (rep (1 : 3 , each= 3 )),
y = rnorm (9 , rep (2 : 4 , each= 3 ), 0.1 ))
mod <- lm (y ~ a - 1 , data = dat)
coef (mod)
a1 a2 a3
1.986017 2.893121 4.082296
a1 a2 a3
1 1 0 0
2 1 0 0
3 1 0 0
4 0 1 0
5 0 1 0
6 0 1 0
7 0 0 1
8 0 0 1
9 0 0 1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
차원 \(k \times (k-1)\) 인 최대랭크(full rank) 행렬 \(C_a\) 에 대해 정방행렬 \([\mathbf{1}_k~C_a]\) 가 정칙(nonsingular)이라고 가정하면 \[
\mathbf{1}_k\mu + \boldsymbol{\alpha} = [\mathbf{1}_k~C_a]\begin{bmatrix} \mu^* \\ \boldsymbol{\alpha}^* \end{bmatrix}
\] 인 \(\mu^*\) , \(\boldsymbol{\alpha}^*\) 가 항상 존재한다.
따라서, \[
\begin{split}
[\mathbf{1}_n~X_a]\begin{bmatrix} 0 \\ \mathbf{1}_k\mu + \boldsymbol{\alpha} \end{bmatrix}
&= X_a(\mathbf{1}_k\mu + \boldsymbol{\alpha})
\\
&= X_a[\mathbf{1}_k~C_a]\begin{bmatrix} \mu^* \\ \boldsymbol{\alpha}^* \end{bmatrix}
= [\mathbf{1}_n ~ X_a C_a]\begin{bmatrix} \mu^* \\ \boldsymbol{\alpha}^* \end{bmatrix}
.
\end{split}
\]
이때 \([\mathbf{1}_n ~ X_a C_a] = X_a[\mathbf{1}_k~C_a]\) 은 최대랭크 행렬이므로 (왜 그런가?) 이를 새로운 모형행렬로 삼으면 \(\mu^*\) , \(\boldsymbol{\alpha}^*\) 은 최소제곱법에 의해 유일하게 결정된다.
위 조건을 만족하는 행렬 \(C_a\) 를 부호화행렬(coding matrix)이라 부른다. 모형에서 \(\mu\) 는 임의이므로 \(\mu = \mu^*\) 로 두면 \[
\boldsymbol{\alpha} = C_a\boldsymbol{\alpha}^*
\] 가 된다.
부호화 행렬의 종류
처리 부호화 (treatment coding)
R의 기본 부호화. 항상 \(\alpha_1 = 0\) 으로 한다. 이렇게 하면 수준 1이 다른 모든 수준을 비교하는 표준 수준으로 취급된다.
mod_treatment <- lm (y ~ a, data= dat)
model.matrix (mod_treatment)
(Intercept) a2 a3
1 1 0 0
2 1 0 0
3 1 0 0
4 1 1 0
5 1 1 0
6 1 1 0
7 1 0 1
8 1 0 1
9 1 0 1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
(alph.star <- coef (mod_treatment)) # mu^* = (Intercept)
(Intercept) a2 a3
1.9860166 0.9071045 2.0962792
(Ca <- contr.treatment (length (levels (dat$ a))))
(alph <- Ca %*% alph.star[- 1 ]) # letting $mu = mu^*$
[,1]
1 0.0000000
2 0.9071045
3 2.0962792
헬메르트 부호화 (Helmert coding)
S-plus의 기본 부호화. 각 열의 합이 0이 되도록 한다.
mod_helmert <- lm (y ~ a, data= dat, contrasts = list (a = "contr.helmert" ))
(alph.star <- coef (mod_helmert))
(Intercept) a1 a2
2.9871445 0.4535523 0.5475757
(Ca <- contr.helmert (length (levels (dat$ a))))
[,1] [,2]
1 -1 -1
2 1 -1
3 0 2
(alph <- Ca %*% alph.star[- 1 ]) # letting $mu = mu^*$
[,1]
1 -1.00112792
2 -0.09402339
3 1.09515132
sum (alph) # numerically zero. why?
직교다항식 부호화 (orthogonal polynomial coding)
R의 순서형 변수 에 대한 기본 부호화.
dat$ b <- as.ordered (dat$ a)
mod_poly <- lm (y ~ b, data= dat)
(alph.star <- coef (mod_poly))
(Intercept) b.L b.Q
2.9871445 1.4822933 0.1151547
(Ca <- contr.poly (length (levels (dat$ b))))
.L .Q
[1,] -7.071068e-01 0.4082483
[2,] -9.073800e-17 -0.8164966
[3,] 7.071068e-01 0.4082483
(alph <- Ca %*% alph.star[- 1 ]) # letting $mu = mu^*$
[,1]
[1,] -1.00112792
[2,] -0.09402339
[3,] 1.09515132
sum (alph) # numerically zero
모수 해석
원모수 \(\mu\) , \(\alpha\) (식별불가능)와 축소된 모수 \(\mu^*\) , \(\alpha^*\) (식별가능) 사이의 관계 \[
\begin{bmatrix} \mu^* \\ \boldsymbol{\alpha}^* \end{bmatrix}
=
[\mathbf{1}_k~C_a]^{-1}
(\mathbf{1}_k\mu + \boldsymbol{\alpha})
\] 를 상기하자.
\(D = [\mathbf{1}_k~C_a]^{-1}\) 로 놓고 \(D\) 의 행을 \(\mathbf{d}_0^T, \mathbf{d}_1^T, \dotsc, \mathbf{d}_{k-1}^T\) 라 하면 \[
I_k = D[\mathbf{1}_k~C_a]
=
\begin{bmatrix} \mathbf{d}_0^T \\ \mathbf{d}_1^T \\ \vdots \\ \mathbf{d}_{k-1}^T \end{bmatrix}
[\mathbf{1}_k~C_a]
=
\begin{bmatrix}
\mathbf{d}_0^T\mathbf{1}_k & \mathbf{d}_0^TC_a \\
\mathbf{d}_1^T\mathbf{1}_k & \mathbf{d}_1^TC_a \\
\vdots & \vdots \\
\mathbf{d}_{k-1}^T\mathbf{1}_k & \mathbf{d}_{k-1}^TC_a
\end{bmatrix}
\] 이므로 \[
\mathbf{d}_0^T C_a = \mathbf{0}^T,
\quad
\mathbf{d}_0^T\mathbf{1}_k = 1,
\quad
\mathbf{d}_i^T\mathbf{1}_k = 0,
~
i=1, \dotsc, k-1
\] 임을 알 수 있다.
이제 \(D\) 를 복호화행렬이라 부르자.
어떤 벡터 \(\mathbf{v}\) 가 \(\mathbf{v}^T\mathbf{1} = 1\) 이면 평균벡터, \(\mathbf{v}^T\mathbf{1} = 0\) 이면 대조벡터라고 부르기로 하면, \(\mathbf{d}_0\) 은 평균벡터, \(\mathbf{d}_1, \dotsc, \mathbf{d}_{k-1}\) 은 대조벡터임을 알 수 있다.
역으로 \(k\times k\) 정칙행렬 \(D\) 를 첫번째 행이 평균벡터, 나머지 행이 대조벡터가 되도록 고르면 그 역행렬 \(D^{-1}\) 은 적당한 부호화행렬 \(C_a\) 에 대해 \(D^{-1} = [\mathbf{1}_k~ C_a]\) 가 된다. (왜 그런가?)
따라서 부호화행렬 \(C_a\) 의 기술과 복호화행렬 \(D\) 의 기술은 동등하다.
이제 \[
\small
\begin{bmatrix} \mu^* \\ \alpha^*_1 \\ \vdots \\ \alpha^*_{k-1} \end{bmatrix}
=
\begin{bmatrix} \mu^* \\ \boldsymbol{\alpha}^* \end{bmatrix}
=
D(\mathbf{1}_k\mu + \boldsymbol{\alpha})
=
\begin{bmatrix} \mu + \mathbf{d}_0^T\boldsymbol{\alpha} \\ \mathbf{d}_1^T\boldsymbol{\alpha} \\ \vdots \\
\mathbf{d}_{k-1}^T\boldsymbol{\alpha} \end{bmatrix}
\] 이 되어 \(\mu^*\) 은 원모수 성분 \((\mu+\alpha_1, \dotsc, \mu+\alpha_k)\) 의 \(\mathbf{d}_0^T = (d_{01}, \dotsc, d_{0k})\) 에 의한 가중평균임을, \(\alpha^*_i\) 는 \(\boldsymbol{\alpha}\) 의 \(\mathbf{d}_i\) 에 의한 대조(contrast)임을 알 수 있다. 즉, \[
\alpha^*_i = \mathbf{d}_i^T\boldsymbol{\alpha}, \quad i=1, \dotsc, k-1
\] 으로 모수 사이의 관계를 해석할 수 있다.
이때 \(\mu\) 는 임의이므로 \(\mu = \mu^*\) 으로 놓으면 가중평균 \(\mathbf{d}_0^T\boldsymbol{\alpha} = 0\) 이 되어 이를 제약조건으로 두고 \((\mu, \boldsymbol{\alpha})\) 를 추정하면 추정값 \((\hat{\mu}, \hat{\boldsymbol{\alpha}})\) 이 유일하게 정해지고 \(\widehat{\mu^*} = \hat{\mu}\) , \(\widehat{\alpha^*_i} = \mathbf{d}_i^T\hat{\boldsymbol{\alpha}}\) 가 된다.
따라서 부호화(복호화)행렬을 사용한 식별 기법은 제약식을 사용한 식별 기법의 특수한 경우임을 알 수 있다.
예: 처리 부호화 (\(\alpha_{1}=0\) 으로 설정)
Ca <- contr.treatment (letters[1 : 5 ]) %>% print
b c d e
a 0 0 0 0
b 1 0 0 0
c 0 1 0 0
d 0 0 1 0
e 0 0 0 1
D <- solve (cbind (1 , Ca)) %>% print
a b c d e
1 0 0 0 0
b -1 1 0 0 0
c -1 0 1 0 0
d -1 0 0 1 0
e -1 0 0 0 1
따라서 \(\mu^* = \mu + \alpha_1\) , \(\alpha^*_1 = \alpha_2 - \alpha_1\) , \(\dotsc\) , \(\alpha_{k-1}^* = \alpha_k - \alpha_1\) .
왜 앞 식별가능모형1과 식별가능모형2–처리부호화 결과가 같았는가?
예: 헬메르트 부호화
Ca <- contr.helmert (letters[1 : 5 ]) %>% print
[,1] [,2] [,3] [,4]
a -1 -1 -1 -1
b 1 -1 -1 -1
c 0 2 -1 -1
d 0 0 3 -1
e 0 0 0 4
D <- solve (cbind (1 , Ca))
D %>% fractions %>% print
a b c d e
[1,] 1/5 1/5 1/5 1/5 1/5
[2,] -1/2 1/2 0 0 0
[3,] -1/6 -1/6 1/3 0 0
[4,] -1/12 -1/12 -1/12 1/4 0
[5,] -1/20 -1/20 -1/20 -1/20 1/5
따라서 \[
\small
\begin{split}
\mu^* &= \mu + \frac{1}{k}\sum_{j=1}^k \alpha_j
\\
\alpha^*_1 &= \frac{1}{2}(\alpha_2 - \alpha_1)
\\
\alpha^*_2 &= \frac{1}{3}(\alpha_3 - \frac{1}{2}\sum_{j=1}^2\alpha_j)
\\
& \vdots
\\
\alpha^*_{k-1} &= \frac{1}{k}(\alpha_k - \frac{1}{k-1}\sum_{j=1}^{k-1}\alpha_j)
\end{split}
\]
왜 앞 식별가능모형2–헬메르트부호화 결과에서 모수의 합이 (수치적으로) 0이었는가?
직교다항식 부호화
\(j\) 차 다항식 \(p_j(x)\) 열이 다음을 만족: \[
\begin{split}
& \sum_{i=1}^n p_j^2(x_i) = 1, \quad j = 0, 1, \dotsc, q
\\
& \sum_{i=1}^n p_j(x_i)p_k(x_i) = 0, \quad j \neq k
.
\end{split}
\]
\(x_i\) 의 열은 수직선에서 등간격으로 설정.
(Ca <- contr.poly (letters[1 : 5 ])) %>% zapsmall %>% print # L=linear, Q=quadratic, etc.
.L .Q .C ^4
[1,] -0.6324555 0.5345225 -0.3162278 0.1195229
[2,] -0.3162278 -0.2672612 0.6324555 -0.4780914
[3,] 0.0000000 -0.5345225 0.0000000 0.7171372
[4,] 0.3162278 -0.2672612 -0.6324555 -0.4780914
[5,] 0.6324555 0.5345225 0.3162278 0.1195229
poly (seq (4 , 6 , 0.5 ), degree= 4 ) %>% zapsmall # coefficients of 4th-degree orthogonal polynomial (Kennedy & Gentle (1980, pp.343--4))
1 2 3 4
[1,] -0.6324555 0.5345225 -0.3162278 0.1195229
[2,] -0.3162278 -0.2672612 0.6324555 -0.4780914
[3,] 0.0000000 -0.5345225 0.0000000 0.7171372
[4,] 0.3162278 -0.2672612 -0.6324555 -0.4780914
[5,] 0.6324555 0.5345225 0.3162278 0.1195229
attr(,"coefs")
attr(,"coefs")$alpha
[1] 5 5 5 5
attr(,"coefs")$norm2
[1] 1.00000000 5.00000000 2.50000000 0.87500000 0.22500000 0.03214286
attr(,"degree")
[1] 1 2 3 4
attr(,"class")
[1] "poly" "matrix"
t (Ca) %*% Ca %>% fractions # orthogonal?
.L .Q .C ^4
.L 1 0 0 0
.Q 0 1 0 0
.C 0 0 1 0
^4 0 0 0 1
D <- solve (cbind (1 , Ca))
D %>% zapsmall %>% print
[,1] [,2] [,3] [,4] [,5]
0.2000000 0.2000000 0.2000000 0.2000000 0.2000000
.L -0.6324555 -0.3162278 0.0000000 0.3162278 0.6324555
.Q 0.5345225 -0.2672612 -0.5345225 -0.2672612 0.5345225
.C -0.3162278 0.6324555 0.0000000 -0.6324555 0.3162278
^4 0.1195229 -0.4780914 0.7171372 -0.4780914 0.1195229
따라서 \(\mu^* = \mu + \frac{1}{k} \underset{j=1} { \stackrel{k}{\sum} } \alpha_j\) .
왜 앞 식별가능모형2–직교부호화 결과에서 모수의 합이 (수치적으로) 0이었는가?
2원 배치
2원 배치 가법 모형
# model formula
y ~ a + b
대수적 기술 \[
y_{ijk} = \mu + \alpha_{i} + \beta_{j} + \epsilon_{ijk},
\]
모형행렬 (랭크 부족) \[
X = [\mathbf{1}, X_a, X_b],
\quad
\mathbf{y} = [\mathbf{1}, X_a, X_b] \begin{bmatrix} \mu \\ \boldsymbol{\alpha} \\ \boldsymbol{\beta} \end{bmatrix}
\] 여기서 \(\mathbf{y}=(y_{ijk})\) , \(\boldsymbol{\alpha}=(\alpha_i)\) , \(\boldsymbol{\beta}=(\beta_j)\) 인 벡터.
축소모형의 모형행렬 : \(X^*=[\mathbf{1}, X_a C_a, X_b C_b]\)
model.matrix (y ~ a + b, data = dat2)
(Intercept) a2 a3 b2 b3
1 1 0 0 0 0
2 1 0 0 1 0
3 1 0 0 0 1
4 1 1 0 0 0
5 1 1 0 1 0
6 1 1 0 0 1
7 1 0 1 0 0
8 1 0 1 1 0
9 1 0 1 0 1
attr(,"assign")
[1] 0 1 1 2 2
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
attr(,"contrasts")$b
[1] "contr.treatment"
model.matrix (y ~ a, data= dat2)
(Intercept) a2 a3
1 1 0 0
2 1 0 0
3 1 0 0
4 1 1 0
5 1 1 0
6 1 1 0
7 1 0 1
8 1 0 1
9 1 0 1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
model.matrix (y ~ b, data= dat2)
(Intercept) b2 b3
1 1 0 0
2 1 1 0
3 1 0 1
4 1 0 0
5 1 1 0
6 1 0 1
7 1 0 0
8 1 1 0
9 1 0 1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$b
[1] "contr.treatment"
절편 항이 없는 축소모형(y ~ a + b - 1
)의 모형 행렬: \(X^*=[X_a ~ X_b C_b]\) .
이 경우 모형행렬 \(X^*\) 는 a
와 b
에 대해 비대칭이고, 순서에 의존한다 (왜 그런가?)
model.matrix (y ~ a + b - 1 , data = dat2)
a1 a2 a3 b2 b3
1 1 0 0 0 0
2 1 0 0 1 0
3 1 0 0 0 1
4 0 1 0 0 0
5 0 1 0 1 0
6 0 1 0 0 1
7 0 0 1 0 0
8 0 0 1 1 0
9 0 0 1 0 1
attr(,"assign")
[1] 1 1 1 2 2
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
attr(,"contrasts")$b
[1] "contr.treatment"
model.matrix (y ~ b + a - 1 , data = dat2)
b1 b2 b3 a2 a3
1 1 0 0 0 0
2 0 1 0 0 0
3 0 0 1 0 0
4 1 0 0 1 0
5 0 1 0 1 0
6 0 0 1 1 0
7 1 0 0 0 1
8 0 1 0 0 1
9 0 0 1 0 1
attr(,"assign")
[1] 1 1 1 2 2
attr(,"contrasts")
attr(,"contrasts")$b
[1] "contr.treatment"
attr(,"contrasts")$a
[1] "contr.treatment"
2원 배치 비가법모형
y ~ a + b + a: b
# or
y ~ a * b
이 모형은 \(rs\) 수준을 갖는 1원배치 모형과 사실상 같다.
대수적 기술 \[
\begin{split}
y_{ijk} &= \mu + \alpha_{i} + \beta_{j} + \gamma_{ij} + \epsilon_{ijk},
\\
&
i=1,2,\dotsc,r;
~
j=1,2,\dotsc, s;
~
k=1,2,\dotsc, n_{ij}
\end{split}
\]
모형 행렬 : \(X=[\mathbf{1}_n, X_a, X_b, X_a \odot X_b]\)
여기서 \(A \odot B\) 는 \(A\) 와 \(B\) 의 한 열씩 뽑아 원소끼리 곱해서 새로운 열 하나를 만드는 연산. \[
\begin{split}
\mathbf{y} &= [\mathbf{1}_n, X_a, X_b, X_a\odot X_b]
\begin{bmatrix} \mu \\ \boldsymbol{\alpha} \\ \boldsymbol{\beta} \\ \boldsymbol{\gamma} \end{bmatrix}
\\
&= \mathbf{1}_n\mu + X_a\boldsymbol{\alpha} + X_b\boldsymbol{\beta} + (X_a \odot X_b)\boldsymbol{\gamma}
\end{split}
\] 여기서 \(\boldsymbol{\gamma} = (\gamma_{ijk})\) 인 벡터.
\(X_a \odot X_b\) 는 a
와 b
로 정의되는 하위범주에 대한 접속(incidence) 행렬.
축소모형의 모형 행렬 : \(X^*=[\mathbf{1}, X_a C_a, X_b C_b, (X_a C_a)\odot (X_b C_b)]\)
열 수: \(1 + (r-1) + (s-1) +(r-1)(s-1) = rs\)
model.matrix (y ~ a * b, data = dat2)
(Intercept) a2 a3 b2 b3 a2:b2 a3:b2 a2:b3 a3:b3
1 1 0 0 0 0 0 0 0 0
2 1 0 0 1 0 0 0 0 0
3 1 0 0 0 1 0 0 0 0
4 1 1 0 0 0 0 0 0 0
5 1 1 0 1 0 1 0 0 0
6 1 1 0 0 1 0 0 1 0
7 1 0 1 0 0 0 0 0 0
8 1 0 1 1 0 0 1 0 0
9 1 0 1 0 1 0 0 0 1
attr(,"assign")
[1] 0 1 1 2 2 3 3 3 3
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
attr(,"contrasts")$b
[1] "contr.treatment"
다음과 비교하자.
X_star <- numeric ()
XaCa <- model.matrix (y ~ a, data= dat2)[, - 1 ]
XbCb <- model.matrix (y ~ b, data= dat2)[, - 1 ]
for (i in seq_len (ncol (XbCb)))
for (j in seq_len (ncol (XaCa)))
X_star <- cbind (X_star, XbCb[, i] * XaCa[, j])
X_star
[,1] [,2] [,3] [,4]
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 1 0 0 0
6 0 0 1 0
7 0 0 0 0
8 0 1 0 0
9 0 0 0 1
다음을 상기하자. \[
\begin{split}
\mathbf{y} &= [\mathbf{1}, X_a C_a, X_b C_b, (X_a C_a)\odot (X_b C_b)]
\begin{bmatrix} \mu \\ \boldsymbol{\alpha}^* \\ \boldsymbol{\beta}^* \\ \boldsymbol{\gamma}^* \end{bmatrix}
\\
&= \mathbf{1}_n\mu + X_aC_a\boldsymbol{\alpha}^* + X_bC_b\boldsymbol{\beta}^* + (X_aC_a \odot X_bC_b)\boldsymbol{\gamma}^*
\end{split}
\]
크로네커 곱 \(\otimes\) 를 이용, \((X_a C_a)\odot (X_b C_b) = (X_a \odot X_b)(C_b \otimes C_a)\) 로 쓸 수 있고, 따라서 \(\boldsymbol{\gamma} = (C_b \otimes C_a) \boldsymbol{\gamma}^*\) .
\(\boldsymbol{\gamma}\) , \(\boldsymbol{\gamma}^*\) 를 각각 \(r \times s\) 행렬 \(\Gamma\) , \((r-1)\times (s-1)\) 행렬 \(\Gamma^*\) 의 벡터 표현으로 이해하면 (\(\boldsymbol{\gamma}=\operatorname{vec}(\Gamma)\) ), \(\Gamma=C_a \Gamma^* C_{b}^T\) 가 성립한다. (왜 그런가?)
식별가능 제약은 \(C_a^T\) 의 널벡터 \(\mathbf{d}_a\) (즉 \(\mathbf{d}_a^T C_a = \mathbf{0}^T\) )와 \(C_b^T\) 의 널벡터 \(\mathbf{d}_b\) 에 대해 \[
\mathbf{d}_{a}^T \Gamma = \mathbf{0}^T,
\quad
\Gamma \mathbf{d}_{b} = \mathbf{0}
\] 으로 쓸 수 있다. (왜 그런가?)
무절편 2원배치 비가법모형 1
y ~ a * b - 1
# or
y ~ a + b + a: b - 1
대수적 기술 \[
\begin{split}
y_{ijk} &= \alpha_{i} + \beta_{j} + \gamma_{ij} + \epsilon_{ijk},
\\
& i=1,2,\dotsc,r;
~
j=1,2,\dotsc, s;
~
k=1,2,\dotsc, n_{ij}
\end{split}
\]
모형 행렬 : \(X^*=[X_a, X_b C_b, X_{a}^{(-r)} \odot (X_b C_b)]\)
\(X_{a}^{(-r)}\) 은 \(X_{a}\) 에서 마지막 열을 뺀 행렬
model.matrix (y ~ a * b - 1 , data = dat2)
a1 a2 a3 b2 b3 a2:b2 a3:b2 a2:b3 a3:b3
1 1 0 0 0 0 0 0 0 0
2 1 0 0 1 0 0 0 0 0
3 1 0 0 0 1 0 0 0 0
4 0 1 0 0 0 0 0 0 0
5 0 1 0 1 0 1 0 0 0
6 0 1 0 0 1 0 0 1 0
7 0 0 1 0 0 0 0 0 0
8 0 0 1 1 0 0 1 0 0
9 0 0 1 0 1 0 0 0 1
attr(,"assign")
[1] 1 1 1 2 2 3 3 3 3
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
attr(,"contrasts")$b
[1] "contr.treatment"
무절편 2원배치 비가법모형 2
대수적 기술 \[
\begin{split}
y_{ijk} &= \alpha_{i} + \beta_{ij} + \epsilon_{ijk},
\\
& i=1,2,\dotsc,r;
~
j=1,2,\dotsc, s;
~
k=1,2,\dotsc, n_{ij}
\end{split}
\]
모형 행렬 : \(X^*=[X_a, X_{a} \odot (X_b C_b)]\)
model.matrix (y ~ - 1 + a + a: b, data = dat2)
a1 a2 a3 a1:b2 a2:b2 a3:b2 a1:b3 a2:b3 a3:b3
1 1 0 0 0 0 0 0 0 0
2 1 0 0 1 0 0 0 0 0
3 1 0 0 0 0 0 1 0 0
4 0 1 0 0 0 0 0 0 0
5 0 1 0 0 1 0 0 0 0
6 0 1 0 0 0 0 0 1 0
7 0 0 1 0 0 0 0 0 0
8 0 0 1 0 0 1 0 0 0
9 0 0 1 0 0 0 0 0 1
attr(,"assign")
[1] 1 1 1 2 2 2 2 2 2
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
attr(,"contrasts")$b
[1] "contr.treatment"