이 절의 시작 부분에서 상호 작용은 ‘곱’의 형태라고 설명했다. 또, ‘8.3.2 범주형 변수’ 절에서 선형 회귀를 수행할 때 범주형 변수는 가변수로 바뀐다고 설명했다. 상호 작용이 있을 때 model.matrix를 살펴보면 이 두 가지 사실을 모두 확인할 수 있다.
> head(model.matrix(m))
(Intercept) fTree1 fTree5 fTree2 fTree4 age fTree1:age fTree5:age fTree2:age fTree4:age
1 1 1 0 0 0 118 118 0 0 0
2 1 1 0 0 0 484 484 0 0 0
3 1 1 0 0 0 664 664 0 0 0
4 1 1 0 0 0 1004 1004 0 0 0
5 1 1 0 0 0 1231 1231 0 0 0
6 1 1 0 0 0 1372 1372 0 0 0
위 결과를 보면, fTree는 fTree1, fTree5, fTree2, fTree4라는 4개의 가변수로 표현되었음을 알 수 있다. 또, age와 fTree의 상호 작용은 fTree1:age, fTree5:age, fTree2:age, fTree4:age로 표현되었다.
좀 더 보기 쉽게 age와 연관이 있는 열들만 뽑아보자.
> mm <- model.matrix(m) > mm[, grep("age", colnames(mm))] age fTree1:age fTree5:age fTree2:age fTree4:age 1 118 118 0 0 0 2 484 484 0 0 0 3 664 664 0 0 0 4 1004 1004 0 0 0 5 1231 1231 0 0 0 6 1372 1372 0 0 0 7 1582 1582 0 0 0 8 118 0 0 118 0 9 484 0 0 484 0 10 664 0 0 664 0 11 1004 0 0 1004 0 12 1231 0 0 1231 0 13 1372 0 0 1372 0 14 1582 0 0 1582 0 15 118 0 0 0 0 16 484 0 0 0 0 17 664 0 0 0 0 18 1004 0 0 0 0 19 1231 0 0 0 0 20 1372 0 0 0 0 21 1582 0 0 0 0 22 118 0 0 0 118 23 484 0 0 0 484 24 664 0 0 0 664 25 1004 0 0 0 1004 26 1231 0 0 0 1231 27 1372 0 0 0 1372 28 1582 0 0 0 1582 29 118 0 118 0 0 30 484 0 484 0 0 31 664 0 664 0 0 32 1004 0 1004 0 0 33 1231 0 1231 0 0 34 1372 0 1372 0 0 35 1582 0 1582 0 0
grep( )은 패턴과 문자열을 인자로 받아 패턴이 문자열 내에 존재하면 1, 그렇지 않으면 0으로 반환하는 함수다. 따라서 grep(“age”, colnames(mm))은 age라는 문자열이 열 이름에 존재하면 1, 그렇지 않으면 0을 반환하므로 age가 포함된 열의 선택을 쉽게 해준다.
결과를 보면 age열은 각 데이터의 age를 그대로 담고 있지만, 상호 작용을 뜻하는 fTree1:age는 1 ~ 7행에 대해서만 age를 갖고 있고 8 ~ 35행에 대해서는 age 값을 갖고 있지 않다. fTree5:age, fTree2:age, fTree4:age도 마찬가지로 일부 행에만 age 값이 들어 있다. 그 이유는 이들 상호 작용을 뜻하는 열들은 포뮬러에 주어진 fTree * age 그대로 가변수 fTreeN에 들어 있는 1 또는 0의 값과 age를 곱한 값을 담고 있기 때문이다.
따라서 가변수가 1인 열에서는 age 값이 상호 작용 열에 나타나지만, 가변수가 0인 열에 대해서는 상호 작용 열의 값이 0으로 나타난다. 이러한 방식으로 행렬을 만듦으로써 ‘곱’의 형태인 상호 작용을 고려한 선형 회귀를 수행하는 것이다.
순서형 범주형 변수 Tree를 사용한 선형 회귀와 더 다양한 시각화를 수행한 내용은 참고자료 [12]를 보기 바란다.