통계/회귀분석 - R 프로그래밍

중회귀모형 - 다(중)공선성, 분산팽창 인자(VIF), 상태지수(CI)

BlueNoa 2021. 6. 28. 04:21
728x90
반응형

· 다(중)공선성(Multicollinearity)

다중회귀 모형에서 분석을 하다 보면 의도치 않게 독립변수(설명변수)들끼리 서로 상관관계를 갖게 되는 경우가 존재한다.

 

독립변수들 간에 영향을 끼치지 않고 종속변수(반응 변수)와 직선의 관계를 갖는 경우 완전공선성이라고 하고, 앞에서 말했듯이 독립변수끼리 영향을 주는 서로 상관관계, 다시 말해 독립변수 간의 선형 관계가 존재하면 다(중)공선성이라고 한다.

 

 

· 다(중)공선성의 문제

중회귀 모형에서 독립(설명) 변수들은 서로 직교한다고 가정한다.(직교란 서로 다른 두 vector의 내적이 0, 즉 90도 직각)

직교를 가정하면 회귀계수의 추정 값이 다른 설명 계수의 존재에 영향을 받지 않으며, 상대적으로 설명변수에 영향을 얼마나 주는지 크기를 비교할 수 있다는 장점이 있다.

 

실제 데이터에서는 이렇게 직교하지 않는 자료들이 많음에도 불구하고 상관의 정도가 크지 않을 경우 심각한 문제를 야기하지 않는 경우가 대부분이다.

하지만 독립변수들 사이에 선형 관계(상관관계)가 강하게 존재한다고 판단되면 해당 독립변수의 제외 처리 등을 고려하여 살펴볼 필요가 있다.

 

※ R에서 pairs(), splom() 또는 3D plot, cor() 등의 명령어들을 통해 검토하여 선형성을 짐작할 수 있다.

 

다공선성 존재 시 회귀계수 추정이 매우 복잡해지므로 회귀분석의 의미가 크게 손상될 수 있다. 따라서 꼭 세심한 분석을 해야만 한다.

 

 

· 다(중)공선성을 찾는 방법

다공선성이 존재하는 경우 나타나는 현상을 토대로 의심할 수 있다.

 

(1) 하나의 설명변수의 추가 또는 제거가 다른 회귀계수의 추정 값에 큰 영향을 준다.

(2) 중요하다고 판단해서 분석에 넣은 변수의 회귀계수가 유의하지 않다고 검정의 결과가 나온다.

(3) 추정된 계수의 부호가 과거 경험(과거 자료)이나 이론적인 유추와 상반되는 부호를 갖는다.

(4) 상관 행렬에서 독립(설명) 변수 간의 상관관계가 크다.

(5) 산점도 행렬에서 설명변수들 사이에 강한 선형 관계(직선)를 보이며 다른 방법으로는 수리적인 설명변수의 분산 팽창인자(VIF), 상태지수(CI) 등으로 다(중)공선성의 존재 여부를 판단할 수 있다.

 

 

  • 설명변수의 분산팽창 인자(VIF, Variance Inflation Factor)

설명변수의 종류가 k개인 중회귀 분석에 설명변수들 사이의 상관계수 행렬을 G라고 하면, G의 역행렬의 대각 원소를 i번째 설명변수의 분산 팽창 VIF_i라 한다.

 

 

 

  • 상태 지수(CI, Condition Index)

설명변수 사이의 다공선성을 판단하는 지표 중 하나로 상태 지수는 설명변수의 상관 행렬 G의 고윳값을 크기순으로 나타내면 λ1 > λ2 > λ3 >... > λk라고 할 수 있다. 그러면 i번째 설명변수의 상태 지수 CI_i의 식은 다음과 같다.

(단, k는 설명변수의 개수)

 

이 상태 지수들이 큰 값을 가질수록 다공선성이 존재한다고 할 수 있다.

명확한 기준은 없지만 어림잡아서 값이 10이 넘으면 다공선성을 경계하고 100 이상이 나오면 매우 심각하다고 볼 수 있다.

 

 

<R코드>

rr = cor(cbind(x1, x2, x3)) # 상관행렬 구하기
invrr = solve(rr)
diag(invrr) # 대각선 방향의 값들
eig = eigen(rr) # 고유값
eigv = eig$avlue # 고유값을 출력
conind = sqrt(eigv[1]/eigv)

 

※ 다공선성이 의심되는 경우, 상관이 큰 변수 중 중요한 변수만 남기고 나머지 변수를 제거하는 방법이 가장 간단하다.

그 외에도 등회귀추정이나 주성분 회귀추정 등을 통해 변수를 고를 수 있다.

 

 


· 다(중)공선성 종합

- 독립변수들 사이에 선형(직선, 상관)관계가 "크게" 존재할 경우 다공선성을 의심

- 설명변수들 사이의 산점도 행렬과 상관계수 행렬을 구하여 선형관계를 살펴본다.

- 분산팽창 인자(VIF)와 상태 지수(CI)가 10을 넘으면 다공선성을 의심한다.

- 설명변수들 사이에 다공선성이 존재하면 회귀가 부정확하여 신뢰할 수 없다.

- 다공선성이 존재할 시 설명변수 중 중요하다고 판단되는 것만을 남기는 방법이 가장 간단한 처리 방법이다.

- 만일 변수에 대한 확실한 파악이 힘들 경우에는 중요하다고 판단되는 설명변수들의 각 조합에 대한 회귀를 실시하여 오차항의 분산 추정값 MSE가 가장 작은 모형을 선택하는 방법이 있다.

 

 

 


<예제>

미국 50개주의 데이터를 가지고 분석을 한다. (단, 원점회귀 등으 분석은 하지 않는다.)

states = as.data.frame(state.x77)
colnames(states)
str(states)
reg = lm(Murder ~ ., data = states)

sum(is.na(states)) # 결측치 없음

summary(reg) # 전체적인 p-value: 3.872e-13 => 0으로 봐도 무관하므로 귀무갓러 기각. 해당 회귀는 유의미하다.

# 상관관계
library(corrgram)
corrgram(states) # 설명변수끼리의 상관관계가 보인다.
corrgram(states, lower.panel = panel.conf)

library(PerformanceAnalytics)
chart.Correlation(states)

# 그래픽
par(mar = c(2,2,2,2))
par(mfrow = c(2,2))
plot(reg)

# 분산성 확인
ncvTest(reg) # p = 0.79694 > 0.05 : 귀무가설을 기각할 수 없다. 그러므로 등분산이다.

# 독립성
library(lmtest)
dwtest(Murder ~ ., data = states) # DW = 1.9476, p-value = 0.4208, 독립이다. 자기상관계수는 0이다.

# 정규성
res = residuals(reg)
hist(res) # 종 모양을 따른다.
shapiro.test(res) # W = 0.98619, p-value = 0.8213 > 0.05, 귀무가설 기각 불가, 정규분포를 따른다.

# 다(중)공선성 확인
cor(states) # 데이터의 양이 너무 많아 확인불가
pairs(states) # 산점도

library(lattice)
splom(~ states[1:4]|Murder, data = states) # 조건부 산점도 행렬 출력

library(rgl)
plot3d(states$Population, states$Murder, states$`Life Exp`, col = rainbow(100)) # 3d로도 확인할 수 있다.

# 이상값의 그래프 출력
influencePlot(reg)

# 분산팽창 인자(VIF)
library(car)
vif(reg) # 개별 값이 10이 넘어가면 문제가 있다고 의심한다. 
mean(vif(reg)) # 2.410119 : 평균이 2가 넘어가므로 다공선성에 문제가 있다고 의심!

# CI
x = cbind(states[,-5])
eigv = eigen(cor(x))$values
ci = sqrt(eigv[1]/eigv) # 10이 넘거나 100이 넘는 값이 존재하지 않는다.
ci

 

corrgram의 상관계수 그림
chart.Correlation(states)

 

influencePlot(reg)

 

plot(reg)

 

pairs(states)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형