logo

R 에서 주성분회귀분석하는 법 📂통계적분석

R 에서 주성분회귀분석하는 법

개요

주성분회귀분석pCR 이란 주성분분석다중회귀분석을 합친 것으로, 주성분분석을 통해 얻은 주성분을 새로운 독립변수로 둔 회귀분석을 말한다. 사실 통계학의 관점에서 주성분분석 그 자체는 별 필요가 없고, 보통 회귀분석에 쓰일 때나 의미가 있다.

실습

(다중공선성을 찾아내는 법에 이어서)

20181226\_143145.png 20181226\_143253.png

주성분을 만들어내는 과정은 행렬분해를 포함한 복잡한 계산을 동반하지만, R에서는 prcomp() 함수를 통해 쉽게 구해낼 수가 있다.

  • (1) Rotation: 실제로 원래의 독립변수에 곱해서 주성분을 만들 계수들을 나타낸다. 예를들어 PC1을 만들기 위해선 population에 $-0.098$, white에 $0.056$, … , poverty에 $-0.187$ 곱한 뒤 모두 더해서 만들어진다. 또한 데이터에 따라선 어떤 주성분이 어떤 변수에 대한 정보를 많이 가지고 있는지 한 눈에 확인할 수 있는 지표가 되기도 한다.
  • (2) Importance of components: 말그대로 각 주성분의 중요도를 나타낸다. Proportion of Variance가 높을수록 데이터의 많은 부분을 설명하고 그만큼 중요한 주성분이라는 의미가 된다. 이를 시각적으로 나타낸 것이 우측의 Scree Plot이다. Scree plot은 그냥 plot() 함수에 주성분분석 결과를 넣은 것만으로도 쉽게 그릴 수 있다. 이 그림을 통해 주성분을 어디까지 쓸 것인지를 결정한다.
  • (3) Elbow Point: Scree plot에서 급격하게 기울기가 바뀌는 지점으로, 이후로는 주성분을 더 써도 이득이 적어지는 부분을 말한다. Elbow point 이후의 주성분은 분석에 쓰지 않아도 딱히 상관 없다. 예제와 같은 경우엔 PC1, PC2, PC3까지만 쓰는 것이 바람직할 것이다.

그런데 결국 이걸 어떻게 회귀분석에 집어넣을지가 문제다. 독립변수들을 Rotation과 곱해서 PC를 만들고 회귀분석을 한 후 원래의 독립변수에 대한 식을 세우는 것은 여간 귀찮은 일이 아니므로, pls 패키지pcr() 함수를 사용해보도록 하자.

20181226\_145248.png 20181226\_145215.png

summary() 함수를 통해 출력된 결과에선 몇 개의 주성분을 사용했을 때 collgeGrad를 얼마나 설명하는지를 알려준다.

위의 주성분분석에서 주성분의 갯수는 $3$ 개면 충분했다. jack.test() 함수의 ncomp 옵션에 3을 넣고 실행시켜보면 주성분에 대한 회귀계수가 아니라 원래 독립변수에 대한 회귀계수를 알려줄 뿐만이 아니라, t검정까지 한번에 해준다.

또한 오른쪽의 잔차그림을 보았을 땐 특별한 문제가 없어보인다.

win.graph(4,4); plot(scale(PCRout$residuals[,,3]),main="Residual")

잔차그림을 출력할 때 주의할 것은 pcr() 함수가 반환하는 결과에 $residuals를 참조함으로써 얻어지는 건 맞는데, 이렇게만 하면 주성분을 몇개나 썼는지에 따른 잔차가 모두 포함된 3차 배열로 나온다는 것이다. 이 예제에선 [,,3]으로 슬라이싱함으로써 주성분이 3개까지 쓰인 PCR의 잔차를 참조했다. 만약 주성분분을 k개만큼 사용했다면 [,,k]과 같이 슬라이싱 해야한다.

코드

아래는 예제 코드다.

install.packages('pls')
install.packages('car')
library(pls)
library(car)
 
X<-MplsDemo[,-1]
Y<-X[,7]; X<-X[,-7]
 
PCAout<-prcomp(X[,-7],center=T,scale.=T); PCAout; summary(PCAout)
win.graph(3,3); plot(PCAout, type='l',main="screeplot")
 
PCRout<-pcr(collegeGrad~.,data=MplsDemo[,-1],validation="LOO",jackknife=T)
summary(PCRout)
jack.test(PCRout,ncomp=3)
 
win.graph(4,4); plot(scale(PCRout$residuals[,,3]),main="Residual")

같이보기