728x90

주성분분석을 R과 SAS를 비교해 보았습니다.
SAS는 무료제품인 SAS University Edition 을 사용하였습니다. SAS UE는 상업용으로는 사용할 수 없습니다.

데이터는 변수가 2개(x1, x2)로 구성된 8개의 관측치입니다. 

예전의 "SAS강좌와 통계컨설팅"에서는 10개의 데이터 였는데 8개로 줄였습니다.

SAS에서는 PROC PRINCOMP 프로시져를 이용하였고

R에서는 패키지 {stats}의 princomp함수를 이용하였습니다.

결과는 동일하게 나왔습니다.

 

* 주성분분석 실행하는 SAS 프로그램;
DATA a1;INPUT x1 x2 @@;CARDS; 
 4 15 
 6 16    
 7 11 
 8 10   
 9  6 
 11  8 
 12 10 
 13 14    
 ; 
PROC PRINCOMP ;VAR x1 x2;RUN; 
PROC PRINCOMP COV;VAR x1 x2;RUN;

(1-1) SAS 프로그램 결과(상관행렬 이용)

PROC PRINCOMP ;VAR x1 x2;RUN; 의 결과 (default로 상관행렬을 이용함)

아무런 옵션이 없이 그냥 PROC PRINCOMP를 이용하면 상관행렬을 이용합니다.

PROC PRINCOMP ;VAR x1 x2;RUN;  기본적으로 상관행렬 이용

주성분1 Prin1 = 0.707107 X x1 - 0.707107 X x2

주성분2 Prin2 = 0.707107 X x1 + 0.707107 X x2 로 구할 수 있습니다.

주성분1이 설명하는 변량은 1.40148이고

주성분2가 설명하는 변량은 0.59852입니다.

 

다음은 주성분갯수를 선택하는데 도움이 되는 Scree 플롯인데 변수가 2개이라서 별로 의미가 없어 보이지만

변수가 여러 개인 경우에는 주성분의 갯수를 결정하는 데 도움이 됩니다.

 

(1-2) R 프로그램 결과(상관행렬 이용)

# 주성분분석을 실행하는 R 프로그램

x1 <- c( 4, 6, 7, 8, 9, 11, 12, 13);

x2 <- c(15,16,11,10, 6, 8, 10, 14);

(dataf01 <- data.frame(x1,x2));

princomp(dataf01,cor=T)   # default

princomp(dataf01,cor=T) 의 결과 

prin_cor <-princomp(dataf01,cor=T) # 상관계수 이용, prin_cor 객체 생성

summary(prin_cor)  # 객체 통계량을 보면 주성분의 표준편차와 설명력을 출력

prin_cor$sdev ^2   #3 표준폍차를 제곱해 보면 주성분의 설명력 출력

prin_cor$loadings  # loadings 를 출력해 보면 고유벡터를 확인해 볼 수 있습니다. 

주성분1 Prin1 = 0.707107 X x1 - 0.707107 X x2

주성분2 Prin2 = 0.707107 X x1 + 0.707107 X x2 로 구할 수 있습니다.

주성분1이 설명하는 변량은 1.40148이고

주성분2가 설명하는 변량은 0.59852입니다.

 

* 참고 R 을 이용한 고유치와 고유벡터의 결과

 

상관행렬을 구한 다음 eigen( ) 함수를 이용하면 고유벡터와 고유치를 확인할 수 있습니다.

> eigen(cor(dataf01))

SAS와 비교하면 주성분계수의 부호가 음과 양으로 바뀌어 있고

주성분의 고유치(eigen value, 설명하는 변량)는 동일한 것을 볼 수 있습니다.

 

(2-1) SAS 프로그램 결과(공분산행렬 이용)

PROC PRINCOMP COV;VAR x1 x2;RUN; 의 결과 (COV 옵션에 의해) 공분산행렬을 이용함

공분산을 사용하려면 PROC PRINCOMP에 cov 옵션을 이용합니다.

주성분1 Prin1 = -0.598741 X x1 + 0.800942 X x2

주성분2 Prin2 =  0.800942 X x1 + 0.598741 X x2 로 구할 수 있습니다.

주성분1이 설명하는 변량은 15.47145이고

주성분2가 설명하는 변량은 6.38569입니다.

(2-2) R 프로그램 결과(공분산행렬 이용)

* 참고 R 의 결과 - SAS와 같은 결과

x1 <- c( 4, 6, 7, 8, 9, 11, 12, 13);

x2 <- c(15,16,11,10, 6, 8, 10, 14);

(dataf01 <- data.frame(x1,x2));

eigen(cov(dataf01))

성분1 Prin1 = -0.598741 X x1 + 0.800942 X x2

주성분2 Prin2 =  0.800942 X x1 - 0.598741 X x2 로 구할 수 있습니다.

주성분1이 설명하는 변량은 15.47145이고

주성분2가 설명하는 변량은 6.38569입니다.

AS와 비교하면 주성분계수의 부호가 음과 양으로 바뀌어 있고

주성분의 고유치(eigen value, 설명하는 변량)는 동일한 것을 볼 수 있습니다.

 

+ Recent posts