티스토리 뷰
이번 글은 이전 글(2023.03.15 - [머신러닝 & 딥러닝] - R기반 래스터 다중공선성 확인하기)에 이어서 래스터 자료를 이용해서 다중공선성을 확인하는 방법 중 생물종 위치나 산불, 산사태, 범죄 등 특정 사건이 발생한 위치에 해당하는 독립변수 값만을 이용해서 한다. 또한 상관계수가 아니 분산팽창계수(VIF)를 이용한다.
일단 작업폴더를 설정하고 필요한 라이브러리를 설치하고 불러온다
# 작업폴더 설정
setwd("c:/R_work")
getwd()
# 라이브러리 불러오기
library(dplyr)
library(raster)
남색이마잠자리 위치에서 생물기후변수 19개 사이의 상호관계를 확인하여 다중공선성을 검토한다.
이를 위해서 남색이마잠자리 위치관련 shp파일을 불러오고 생물기후변수 19개 변수를 불러온다.
#남색이마잠자리 shp 파일 지정
file <- "./남색이마잠자리_pt.shp
# shape 파일 불러오기
sp <- shapefile(file)
head(sp)
class(sp)
# bioclim data 해상도 10분짜리 다운로드하기
bio <- raster::getData('worldclim', var='bio', res=10)
bio
names(bio)
# bio 변수 1번인 평균기온 출력하고 그 위에 남색이마잠자리 위치포인터 올리기
plot(bio[[1]])
points(sp)
동남아시아로 한정하기 위해서 대상지역에 해당하는 shp 파일을 불러오고 대상지역에 x좌표와 y좌표의 최소값과 최대값을 이용한다.
ext <- "./남색이마잠자리_AOI.shp" # shape 파일 지정
sp_ext <- shapefile(ext) # shape 파일 불러오기
head(sp_ext)
class(sp_ext)
e <- extent(sp_ext)
e
대상지역이 결정되면 대상지역 안에 있는 생물종위치와 환경자료를 잘라낸다.
spg <- crop(sp, e)
points(spg,col='red')
bioc <- crop(bio, e)
plot(bioc[[1]])
points(spg)
class(spg)
래스터 파일로 구성된 환경변수 자료의 상호 상관관계를 계산하기 위해서 raster.cor.matrix()함수를 이용한다.
또한 분산팽창계수인 VIF지수를 사용하기 위해서는 usdm 라이브러리를 불러오고 vif() 함수를 이용한다.
다음은 래스터 전체를 대상으로 상관관계와 분산팽계수를 계산한다.
# 다중공선성 영향 제거
library(usdm)
raster.cor.matrix(bioc)
#------------------------
vif(bioc)
#------------------------------
다음 VIF 지수값을 보면 10이상의 값을 가진 환경변수를 볼 수 있다. VIF 지수값이 10이상이면 다중공선성이 있다고 할 수 있다.
이제 생물종의 위치에서 래스터 환경변수 값을 raster::extract()함수를 이용하여 추출한 다음 상관관계와 분산팽창계수를 계산한다.
ex <- raster::extract(bioc,spg)
class(ex)
head(ex)
ex
nrow(ex)
#-------------------------
v <- vifstep(ex)
v
VIF 계산한 결과 지수값이 10이상 독립변수를 제외한 다음 8개의 독립변수가 선택된 것을 알 수 있다
위에서 분산팽창계수 VIF 값이 10이하인 독립변수인 래스터 파일만을 exclude()함수를 이용해서 선택한다.
bioc_ex_vif <- exclude(bioc, v)
plot(bioc_ex_vif)
다음은 참고로 독립변수 간의 상관관계를 계산하는 방법이다. matrxi array 자료 형태인 ex 파일을 data.frame자료 형태로 변환한 다음 cor()함수를 이용해서 상관계수를 계산한다.
#-----------------------
ex_df =as.data.frame(bioc_ex_vif)
ex_df
class(ex_df)
cor(ex_df, use = "pairwise")
다음은 QGIS이나 다른 목적으로 사용하기 위해서 다중공선성이 없고 생물종 위치에 해당하는 독립변수 값을 추출하여 GIS shp파일을 만드는 구문이다.
#--------------
ex_sp <- raster::extract(bioc_ex_vif,spg, sp=TRUE)
head(ex_sp)
raster::shapefile(ex_sp, "ex_val.shp", overwrite=TRUE)
전체코드
# 작업폴더 설정
setwd("c:/R_work")
getwd()
# 라이브러리 불러오기
library(dplyr)
library(raster)
#남색이마잠자리 shp 파일 지정
file <- "./남색이마잠자리_pt.shp"
# shape 파일 불러오기
sp <- shapefile(file)
head(sp)
class(sp)
# bioclim data 해상도 10분짜리 다운로드하기
bio <- raster::getData('worldclim', var='bio', res=10)
bio
names(bio)
# bio 변수 1번인 평균기온 출력하고 그 위에 남색이마잠자리 위치포인터 올리기
plot(bio[[1]])
points(sp)
class(bio[[1]])
ext <- "./남색이마잠자리_AOI.shp" # shape 파일 지정
sp_ext <- shapefile(ext) # shape 파일 불러오기
head(sp_ext)
class(sp_ext)
e <- extent(sp_ext)
e
spg <- crop(sp, e)
points(spg,col='red')
bioc <- crop(bio, e)
plot(bioc[[1]])
points(spg)
class(spg)
for (x in 1:19) {
print(names(bioc[[x]]))
writeRaster(bioc[[x]], paste('wc10_asc/','bio_',x,'.asc'), NAflag=-9999, overwrite=TRUE)
}
# 다중공선성 영향 제거
library(usdm)
raster.cor.matrix(bioc)
#------------------------
vif(bioc)
#------------------------------
ex <- raster::extract(bioc,spg)
class(ex)
head(ex)
ex
nrow(ex)
#-------------------------
v <- vifstep(ex)
#vifcor
v
bioc_ex_vif <- exclude(bioc, v)
plot(bioc_ex_vif)
#-----------------------
ex_df =as.data.frame(ex)
ex_df
class(ex_df)
cor(ex_df, use = "pairwise")
#--------------
ex_sp <- raster::extract(bioc_ex_vif,spg, sp=TRUE)
head(ex_sp)
raster::shapefile(ex_sp, "ex_val.shp", overwrite=TRUE)
'머신러닝 & 딥러닝' 카테고리의 다른 글
위성사진들을 딥러닝 모델에 적합한 형태로 변환하는 기본코드 (0) | 2023.03.21 |
---|---|
위성사진를 딥러닝에 맞게 데이터를 생성하는 방법 (0) | 2023.03.21 |
R기반 래스터 다중공선성 확인하기 (0) | 2023.03.15 |
R기반 SDM패키지를 이용하여 생물종 분포모델 - 3편 (0) | 2023.03.07 |
R기반 SDM패키지를 이용한 생물종 분포모델 - 2편 (0) | 2023.03.05 |