티스토리 뷰

반응형

1. 다중공선성(multicollinearity)

다중공선성(multicollinearity)란 독립 변수의 일부가 다른 독립 변수의 조합으로 통계학이 회귀분석에 사용되는 경우에, 독립 변수들이 서로 독립이 아니라 상호 상관관계가 강한 경우에 발생하는 문제이다. 독립변수들간에 정확한 선형관계가 존재하는 완전공선성의 경우와  독립변수들간에 높은 선형관계가 존재하는 다중공선성으로 구분하기도 한다. 다중공선성은 회귀분석의 전제 가정인 독립변수들은 상호 독립이라는 회귀분석의 전제 가정을 위배하고 또한 독립 변수간의 상관성이 높아 회귀모델의 과적합을 가져오는 문제를 발생할 수 있다. 그래서 상관성이 높은 변수들 중 하나를 제거함으로써 이러한 문제를 해결한다.

 

이 글에서 래스터 자료를 이용해서 다중공선성을 확인하는 방법을 설명한다. 확인하는 방법은 크게 두가지로 다음과 같다.

  1. 독립변수들간의 상관계수를 구한다.
  2. 분산팽창요인(VIF, Variance Inflation Factor)을 구하여 이 값이 10을 넘는다면 보통 다중공선성의 문제가 있다.

이를 해결하기 위해서는 다음 4가지 방법 중 하나를 이용한다.

  1. 상관관계가 높은 독립변수중 하나 혹은 일부를 제거한다.
  2. 변수를 변형시키거나 새로운 관측치를 이용한다.
  3. 자료를 수집하는 현장의 상황을 보아 상관관계의 이유를 파악하여 해결한다.
  4. 주성분 분석(PCA, Principal Component Analysis)을 이용한 diagonal matrix의 형태로 공선성을 없애준다.

이 글에서는 독립변수의 상관관계를 이용한 방법을 설명한다.

 

1) 일단 작업폴더를 설정하고 필요한 라이브러리를 설치한다.

setwd("c:/R_Work/enmevaluate_for_enmeval_2.0/")

library(devtools)
install_github("danlwarren/ENMTools")

library(ENMTools)
library(raster)

2) 여기서 bioclimate data 10개 변수의 다중공선성을 확인하기 위해서 래스터 파일 10개를 불러와서 1개의 파일로 합친다.

bio1 <- raster("bio1.asc")
bio5 <- raster("bio5.asc")
bio6 <- raster("bio6.asc")
bio7 <- raster("bio7.asc")
bio8 <- raster("bio8.asc")
bio12 <- raster("bio12.asc")
bio16 <- raster("bio16.asc")
bio17 <- raster("bio17.asc")
biocateg1 <- raster("biocateg1.asc")
biocateg2 <- raster("biocateg2.asc")

env <- stack(bio1, bio5, bio6, bio7, bio8, bio12, bio16, bio17, biocateg1, biocateg2)
env
plot(env)

3) 10개 변수간의 상관계수를 산출하기 위해 다음 명령어 구문을 실행한다. 최종 결과 파일은 env_correlation.csv파일로 저장한다.

c =raster.cor.matrix(env, method = "pearson")

write.csv(c, 'env_correlation.csv')

4) CSV 파일을 엑셀에서 열고 상관계수가 0.7이상인 변수는 빨간 색상으로 표시한다.

변수 하나씩 상관계수를 살펴보면서 제거하고 나면 최종적으로 bio1, bio7, bio12, biocateg1, biocateg2 변수가 남는 것을 알 수 있다. 물론 이때 상관계수가 0.7이 아닌 더 높게 설정해서 변수를 선택해도 된다. 

5) 위의 방법은 래스터 전체를 대상으로 다중공선성을 확인하는 방법이다. 

2편에서는 생물종 위치나, 산사태, 산불, 로드킬, 범죄 등 특정사건이 발생한 위치에 해당하는 환경변수값을 추출하여 다중공선성을 확인하는 방법을 설명한다( 2023.03.16 - [머신러닝 & 딥러닝] - R 프로그램을 이용해서 다중공선성 확인하기 - 2편 ).

2. 전체 코드

setwd("c:/R_Work/enmevaluate_for_enmeval_2.0/")

library(devtools)
install_github("danlwarren/ENMTools")

library(ENMTools)
library(raster)

bio1 <- raster("bio1.asc")
bio5 <- raster("bio5.asc")
bio6 <- raster("bio6.asc")
bio7 <- raster("bio7.asc")
bio8 <- raster("bio8.asc")
bio12 <- raster("bio12.asc")
bio16 <- raster("bio16.asc")
bio17 <- raster("bio17.asc")
biocateg1 <- raster("biocateg1.asc")
biocateg2 <- raster("biocateg2.asc")

env <- stack(bio1, bio5, bio6, bio7, bio8, bio12, bio16, bio17, biocateg1, biocateg2)
env
plot(env)

c =raster.cor.matrix(env, method = "pearson")
write.csv(c, 'env_correlation.csv')

 

반응형
댓글