Programming/R

[데이터 시각화] R에서 4d plot 그리기 | misc3d, rgl

어쩌다통계 2022. 10. 19. 00:50
728x90

모델을 만들고 모델 적합이 잘되었는지 확인하고 또 해석하기 위해 여러 시각화 방법을 사용합니다.

하지만 차원이 3차원이 넘어가면 표현하기 어려워지는데, 3차원 그래프에 색을 넣어 4차원까지 표현할 수 있습니다.

 

본 포스팅에서는 3개의 독립변수와 2개의 종속변수가 있다고 가정하고 각 종속 변수를 예측하는 회귀모델을 세우고 두 회귀식이 어떻게 생겼는지 4d로 나타내는 방법에 대해 소개합니다.

 

$Y_1 = a_0 + a_1X_1 + a_2X_2 + a_3X_3$

$Y_2 = b_0 + b_1X_1 + b_2X_2 + b_3X_3$

 

먼저 가상의 데이터를 생성합니다.

#library
library(RColorBrewer) # color palette
library(misc3d)          # 3d plot
library(rgl) 

#가상 데이터 생성 
set.seed(1025)
x1 = rnorm(100, 5, 10)
x2 = rpois(100, 50)
x3 = rchisq(100, 17)
noise = runif(100, -100, 100)

y1 = x1^2 + x2 + x3 + noise
y2 = 5*(x1+10)^2 - 2*x2 - 1/x3 + noise

 

다음은 이 데이터로 회귀모델을 적합합니다.

#회귀 적합  
reg1 = lm(y1~x1+x2+x3); summary(reg1)
reg2 = lm(y2~x1+x2+x3); summary(reg2)

 

결과는 형편없지만, 우리의 목적을 시각화!이니까 모델의 성능은 무시하고 넘어갑니다 : )

 

이제는 x1, x2, x3에 새로운 데이터를 넣어서 y1, y2를 회귀모델을 활용해 예측해봅니다.

#그리드 만들기
x1 = seq(0, 5, 0.05)
x2 = seq(40, 50, 0.1)
x3 = seq(10, 20, 0.1)

#그리드에 해당하는 y예측하기 
gg = expand.grid(x1=x1, x2=x2, x3=x3)
gg$pred1 =predict(reg1,newdata=gg[,1:3], type = "response")
gg$pred2 =predict(reg2,newdata=gg[,1:3], type = "response")

 

그림을 그릴 데이터는 모두 준비되었으니 그림을 그릴 도구를 만듭니다.

base palette는 색이 별로라 RColorBrewer 패키지를 사용해 y1은 파란 계열, y2는 빨간 계열로 palette를 만들어줍니다.

#y 범위
range(gg$pred1) # 95, 192
range(gg$pred2) # 169, 529

#level & color
levels1 = seq(100,120, length=5)
levels2 = seq(1200,1500, length=5)

col1 = brewer.pal(5,"Blues")
col2 = brewer.pal(5,"Reds")

 

마지막으로 rgl 패키지의 plot3d와 misc3d 패키지의 contour3d를 활용해 3d plot을 그려줍니다.

#4d plot그리기 
pred1 = array(gg$pred1, c(101,101,101))
pred2 = array(gg$pred2, c(101,101,101))

plot3d(gg, type = "n")
contour3d(pred1, levels1, x1,x2,x3, color = col1, alpha = 0.5, add = TRUE)
contour3d(pred2, levels2, x1,x2,x3, color = col2, alpha = 0.5, add = TRUE)

 

위의 코드를 실행하면 RGL device창이 떠서 움직이면서 결과물을 확인할 수 있습니다.

y1를 최대화하고 y2를 최소화하는 구간을 찾으려면 plot에서 진한 파랑과 연한 빨강 사이의 구간을 보면 되겠네요.

 

반응형