다중공선성 :: R 기초 통계 - mindscale
Skip to content

다중공선성

공선성(collinearity): 하나의 독립변수가 다른 하나의 독립변수로 잘 예측되는 경우, 또는 서로 상관이 높은 경우

다중공선성(multicollinearity): 하나의 독립변수가 다른 여러 개의 독립변수들로 잘 예측되는 경우

(다중)공선성이 있으면:

  • 계수 추정이 잘 되지 않거나 불안정해져서 데이터가 약간만 바뀌어도 추정치가 크게 달라질 수 있다
  • 계수가 통계적으로 유의미하지 않은 것처럼 나올 수 있다

(다중)공선성의 진단

  • 분산팽창계수(VIF, Variance Inflation Factor)를 구하여 판단
  • 엄밀한 기준은 없으나 보통 10보다 크면 다중공선성이 있다고 판단(5를 기준으로 하기도 함)

예제 데이터

crab.csv를 다운로드 받아 연다. 이 데이터는 게의 크기와 무게 등을 측정한 데이터이다.

df = read.csv('crab.csv')
head(df)
  crab sat y weight width color spine
1 1    8   1 3.05   28.3  2     3    
2 2    0   0 1.55   22.5  3     3    
3 3    9   1 2.30   26.0  1     1    
4 4    0   0 2.10   24.8  3     3    
5 5    4   1 2.60   26.0  3     3    
6 6    0   0 2.10   23.8  2     3    

회귀분석

먼저 회귀분석을 해본다.

model = lm(y ~ sat + weight + width, df)
summary(model)
Call:
lm(formula = y ~ sat + weight + width, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89580 -0.29752  0.01245  0.28001  0.70921 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.936650   0.500403  -1.872   0.0630 .  
sat          0.097113   0.008814  11.018   <2e-16 ***
weight      -0.046514   0.097890  -0.475   0.6353    
width        0.053544   0.026465   2.023   0.0446 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3381 on 169 degrees of freedom
Multiple R-squared:  0.5145,	Adjusted R-squared:  0.5058 
F-statistic: 59.69 on 3 and 169 DF,  p-value: < 2.2e-16

결과를 보면 유의수준 5%에서 satwidth는 통계적으로 유의미하고, weight는 유의미하지 않게 나왔다.

VIF 계산

car 라이브러리를 불러들인다. 없으면 install.packages('car')로 설치한다.

library(car)
Loading required package: carData

VIF를 계산하는 함수는 vif이다.

vif(model)
     sat   weight    width 
1.158837 4.801679 4.688660 

weightwidth의 VIF가 각각 4.8과 4.6이다. 게의 무게(weight)와 너비(width)는 서로 상관이 높기 때문에 VIF가 약간 높게 나타나는 것이다.

대처

  • 계수가 통계적으로 유의미하지 않다면 대처
  • 계수가 통계적으로 유의미하다면 VIF가 크더라도 특별히 대처할 필요없음
  • 변수들을 더하거나 빼서 새로운 변수를 만든다
  • (개념적으로나 이론적으로) 두 예측변수를 더하거나 빼더라도 문제가 없는 경우
    • 예) 남편의 수입과 아내의 수입이 서로 상관이 높다면, 두 개를 더해 가족 수입이라는 하나의 변수로 투입한다
  • 더하거나 빼기 어려운 경우는 변수를 모형에서 제거한다
    • 단, 변수를 제거하는 것은 자료의 다양성을 해치고, 분석하려던 가설이나 이론에 영향을 미칠 수 있기 때문에 가급적 자제

weightwidth가 VIF 기준을 넘는 것은 아니지만 실험삼아 width를 제거해보자.

summary(lm(y ~ sat + weight, df))
Call:
lm(formula = y ~ sat + weight, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89198 -0.30621  0.03393  0.27644  0.65124 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.04951    0.11426   0.433   0.6653    
sat          0.09763    0.00889  10.982   <2e-16 ***
weight       0.12601    0.04850   2.598   0.0102 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3411 on 170 degrees of freedom
Multiple R-squared:  0.5027,	Adjusted R-squared:  0.4969 
F-statistic: 85.93 on 2 and 170 DF,  p-value: < 2.2e-16

이전의 분석에서는 weight가 유의미하지 않게 나왔지만, width를 제거한 후에는 유의미하게 나왔다. weightwidth가 공선성이 있기 때문에 width를 제거하자 weight가 유의미해진 것으로 볼 수 있다.