본문 바로가기

Deep Learning + AI

데이터분석응용 in R_회귀분석 pt3 실습260408

반응형

# 선형성 위반_ violation of linearity

 

Bacteria <- read.table("./datasets/Bacteria.txt", sep = "\t", header = TRUE)

Bacteria

 

head(Bacteria, 5)

  t N_t
1 1 355
2 2 211
3 3 197
4 4 166
5 5 142

 

# 도식화해보자

par(mar = c(3, 3, 2, 1)) # 마진 줄이기
plot(N_t ~ t, data = Bacteria, pch = 19)

# pch = 19는 안해도 되다.

bacteria

 

# 왼쪽 위 점 하나만 붕떠있다.

# 단순히 붕 떠있기만 한게 아니라 그 점으로 인해 전체 선이 곡선으로 보인다.

# 다시 말해 양끝점을 이어봤을때 선형성이 있다고 보기 힘들다.

 

 

# 우선 선형회귀를 해보자.

reg1 <- lm(N_t ~ t, data = Bacteria)
summary(reg1)

Call:
lm(formula = N_t ~ t, data = Bacteria)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.867 -23.599  -9.652  10.223 114.883 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   259.58      22.73  11.420 3.78e-08 ***
t             -19.46       2.50  -7.786 3.01e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.83 on 13 degrees of freedom
Multiple R-squared:  0.8234,	Adjusted R-squared:  0.8098 
F-statistic: 60.62 on 1 and 13 DF,  p-value: 3.006e-06

# 이쯤되면 봐야할건 설명 안해도 뻔하다.

# 아참. 근데 이제 보니 Adjusted R-squared랑 Multipld R-squared랑 따로 분리해서 봐야겠더라..

# 결과 해석은 지금까지 큰 차이가 없었겠지만, 서로 다른 모델 성능 비교하는 때를 제외하고는

# Multiple R-squared를 보는게 맞겠더라.. 

 

# 아무튼 내용 해석해보자.

# 1. Multiple R-squared 값으로 보아 설명력 굿.

# 2. F-statistic의 p-value값으로 보아 해당 모형 유의미하다. 굿.

#     (다시 말해 적어도 어느 변수 하나는 의미가 있다.)

# 3. 유일 변수인 t의 p-value값도 0.001이상 유의수준에서 유의하다. 굿.

# 결론 : 좋은 모형

 

# (+추가해석 : t가 1증가할때만다 박테리아는 -19.46 증가한다.)

 

 

 

# 그치만 우리가 이제 봐야할것.

 

# 정말 좋은 모형일까?

 

# 무슨 말이냐면,

# 이 회귀모형에는 기본 가정이 있다.

# 1. 선형성, 2. 오차의 (정규성/등분산성/평균이 0/독립성),

# 3. 예측 변수의 선형종속성(=다중공선성x)

 

# 이들도 전부 만족해야 정말 제대로 잘 만들어졌다라고 할 수 있겠다.

 

 

# 1. 잔차 vs x변수(solution of 가정 2.)

r <- rstandard(reg1)

 

plot(Bacteria$t, r, pch = 19) 
abline(h = c(-2, 0, 2), lty = 2)

plot

 

#  abline은 -2~2사이에 데이터의 95퍼가 들어가야 해서

#  그런지를 검증하려고 선을 긋고 본것이다.

# 참고로 -3~3사이를 긋는다면 그건 데이터의 99퍼가 그 선 사이에 있는지 보려고 그은것!

 

# 아무튼 plot을 보면 대체적으로 문제가 있다.

# 잔차에서는 아무 패턴도 읽히면 안되는데 너무 명확한 2차곡선 형태이다.

 

# 현재 Nt = B0+B1*t+e(나머지)

# 이 e(나머지)들만으로 그래프 그린건데

# 이차곡선이 보인다는건

# 이런 패턴이 앞의 변수들에 반영되지 않았다는 증거

 

# 실제로는 설명력이 좋았지만

# 선형에 이차함수가 적용되지 않았다는 증거이다.

# 다시말해 적절한 모형이 아니다.

 

 

## 추가 설명

# p-value들은 해당 모델/변이 정말로 (우연이 아니라) y에 영향을 주는게 맞는지만 본다.

# R^2은 해당 모형의 설명력만 본다.

# 다시말해, x,y관계가 선형인지와 같은 기타 정보들은 확인하지 않는다.

 

# 현재 데이터는 곡선 관계인데,

# 모델이 직선으로 억지로 맞춘 상태이다.

 

# 정리하면,

# 잔차가 무작위로 분포하지 않고,

# 곡선 형태를 보이므로 선형성 가정이 위배된다.

# 따라서 현재 선형회귀모형은 부적절하다.

 

 

# x와 y의 관계를 변환해서 이 상황을 타개해야한다.

 

# 로그변환 _ after log-transformation

Bacteria$ln.N_t <- log(Bacteria$N_t)

# 로그를 취한후 새로운 열을 추가하고,,


par(mar = c(3, 3, 2, 1))
plot(ln.N_t ~ t, data = Bacteria, pch = 19)

plot2

 

# 산점도를 그려주니 전과 달리,, 선형성이 보인다.

 

 

# 다시 lm을 돌려보자.

reg2 <- lm(ln.N_t ~ t, data = Bacteria)
summary(reg2)



Call:
lm(formula = ln.N_t ~ t, data = Bacteria)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.18445 -0.06189  0.01253  0.05201  0.20021 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.973160   0.059778   99.92  < 2e-16 ***
t           -0.218425   0.006575  -33.22 5.86e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.11 on 13 degrees of freedom
Multiple R-squared:  0.9884,	Adjusted R-squared:  0.9875 
F-statistic:  1104 on 1 and 13 DF,  p-value: 5.86e-14

# 설명력도 p-value들도 여전히 굿~~~~

 

 

# 다시 빠르게 잔차vs x변수 플랏도 그려보자.

r <- rstandard(reg2)
plot(Bacteria$t, r, pch = 19)
abline(h = c(-2, 0, 2), lty = 2)

잔차 vs x변수

 

# 전에 그렸던 plot과는 달리 이번에는 -2~2사이에 잘 존재한다.

# 랜덤성 있게 특정 패턴도 보이지 않는다

# 형태가 좋으니 reg2 모델을 받아들일 수 있겠다.

 

# 참고로 gpt에게 물어보니 lm 모델 summary를 보기 전에,

# 이런 가정사항 체크를 먼저하고 들어간다고 한다.

 

 

 

 

# 다중공선성

EEO <- read.table("./datasets/EEO.txt", sep = "\t", header = TRUE)

eeo


head(EEO, 5)

      ACHV      FAM     PEER   SCHOOL
1 -0.43148  0.60814  0.03509  0.16607
2  0.79969  0.79369  0.47924  0.53356
3 -0.92467 -0.82630 -0.61951 -0.78635
4 -2.19081 -1.25310 -1.21675 -1.04076
5 -2.84818  0.17399 -0.18517  0.14229

 

 

# 선형회귀식을 일단 만들어보자.

reg <- lm(ACHV ~ FAM+PEER+SCHOOL, data = EEO)
summary(reg)



Call:
lm(formula = ACHV ~ FAM + PEER + SCHOOL, data = EEO)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.2096 -1.3934 -0.2947  1.1415  4.5881 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.06996    0.25064  -0.279    0.781
FAM          1.10126    1.41056   0.781    0.438
PEER         2.32206    1.48129   1.568    0.122
SCHOOL      -2.28100    2.22045  -1.027    0.308

Residual standard error: 2.07 on 66 degrees of freedom
Multiple R-squared:  0.2063,	Adjusted R-squared:  0.1702 
F-statistic: 5.717 on 3 and 66 DF,  p-value: 0.001535

# 각 변수들 유의성도 없고,,

# 설명력도 똥인데

# 전체 모델의 유의성이 있다.

# 즉 전체 모델을 합쳤더니 종속변수에 영향을 미치는 정도가 존재했다.

 

# 제 역할을 하는 변수가 없는데 전체 모델이 유의미한 이유는??

# 다중공선성 때문일 확률이 높다.

 

 

## 추가설명 _ 이게 도대체 왜 다중공선성 때문이 된걸까?

# 다중공선성이 존재한다는건 변수들의 영향력이 비슷하다는 뜻이다.

# 비슷할 경우 종속변수의 변화를 누구의 공으로 돌려야할지 결정이 어려워진다.

# 그렇게 계수의 공이 데이터별로 자주 변하게 된다. 즉, 분산이 커진다.

# 루트분산인 표준오차도 커진다. 이로 인해, 각 계수가 유의하다고 보기 어려워진다.

# 그러나, 전체적으로는 모형이 유의하다고 할 수 있는 상황이 된다.

 

 

# 다중공선성 상황임을 의심했으면

# 이제 어떤 변수들이 서로 관계가 있는지 봐야한다.

 

# 검증 방법은 크게 3가지이다.

# 첫번째는 앞에서 했던 f-stat의 p-value와 변수들의 p-value를 같이 보는것이다.

# 두번째 세번째는,,,

 

 

# 2. cor() + plot

cor(EEO)

# 변수들간이니 아래 코드로 보는게 더 옳겠다.

# cor(EEO[c("FAM", "PEER", "SCHOOL")])

            ACHV       FAM      PEER    SCHOOL
ACHV   1.0000000 0.4194588 0.4398464 0.4181006
FAM    0.4194588 1.0000000 0.9600806 0.9856837
PEER   0.4398464 0.9600806 1.0000000 0.9821601
SCHOOL 0.4181006 0.9856837 0.9821601 1.0000000

 

# cor들이 전반적으로 다 높은것 같다..

# peer ≈ FAM ≈ SCHOOL

 

# 그림으로도 봐보자

plot(EEO[c("FAM", "PEER", "SCHOOL")], pch = 19, cex = 1)

cor plot


# 진짜 선형!!!

 

 

# 3. vif() (variance inflation factor)

 

library(car)
vif(reg)

     FAM     PEER   SCHOOL 
37.58064 30.21166 83.15544 

 

# vif값이 10보다 크거나 같으면 다중공선성이 있다고 판단한다.

# 보니깐 10을 한참 상회한다.

 

 

# 자 그럼 다중공선성임을 확진했다.

# 그럼 해결은??

# 필요없는 변수를 하나 빼는것이다.

 

 

 

# + 마지막으로 다른 문제는 없나 볼겸,,

# 잔차와 추정값 y hat과의 관계도 도식화 해보겠다.

# 이들의 관계는 패턴이 없어야 좋다.

 

par(mar = c(3, 3, 2, 1))
plot(fitted(reg), rstandard(reg), pch = 19)
abline(h = c(-2, 0, 2), lty=2)

y hat plot

 

# 보아하니 잔차상으로는 문제가 없다. 굿

 

 

 

# 변수선택 _ variable selection

Supervisor <- read.table("./datasets/Supervisor.txt", sep = "\t", header = TRUE)

supervisor

 


head(Supervisor, 5)

   Y X1 X2 X3 X4 X5 X6
1 43 51 30 39 61 92 45
2 63 64 51 54 63 73 47
3 71 70 68 69 76 86 48
4 61 63 45 47 54 84 35
5 81 78 56 66 71 83 47

 

 

# 셋째자리까지 상관계수 추출해보자.

round(cor(Supervisor[c("X1", "X2", "X3", "X4", "X5", "X6")]), digits = 3)

      X1    X2    X3    X4    X5    X6
X1 1.000 0.558 0.597 0.669 0.188 0.225
X2 0.558 1.000 0.493 0.445 0.147 0.343
X3 0.597 0.493 1.000 0.640 0.116 0.532
X4 0.669 0.445 0.640 1.000 0.377 0.574
X5 0.188 0.147 0.116 0.377 1.000 0.283
X6 0.225 0.343 0.532 0.574 0.283 1.000

 

# 선형회귀식도 만들자.
reg <- lm(Y ~ X1+X2+X3+X4+X5+X6, data = Supervisor)
summary(reg)

Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = Supervisor)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.9418  -4.3555   0.3158   5.5425  11.5990 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 10.78708   11.58926   0.931 0.361634    
X1           0.61319    0.16098   3.809 0.000903 ***
X2          -0.07305    0.13572  -0.538 0.595594    
X3           0.32033    0.16852   1.901 0.069925 .  
X4           0.08173    0.22148   0.369 0.715480    
X5           0.03838    0.14700   0.261 0.796334    
X6          -0.21706    0.17821  -1.218 0.235577    
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.068 on 23 degrees of freedom
Multiple R-squared:  0.7326,	Adjusted R-squared:  0.6628 
F-statistic:  10.5 on 6 and 23 DF,  p-value: 1.24e-05

# X1,X3 변수가 유의미하다.

# 설명력은 적절하고, 전체 모형도 유의미

# 결과를 봤을때에는 다중공선성도 있을것 같다.

 

# 다중공선성 체크

library(olsrr)
ols_vif_tol(reg)

  Variables Tolerance      VIF
1        X1 0.3749447 2.667060
2        X2 0.6246520 1.600891
3        X3 0.4403263 2.271043
4        X4 0.3248624 3.078226
5        X5 0.8142600 1.228109
6        X6 0.5124025 1.951591

# 다중공선성은 없다.

 

 

# 1. 전진선택법

forward <- ols_step_forward_p(reg, p_val = 0.3)
print(forward)




                             Stepwise Summary                              
-------------------------------------------------------------------------
Step    Variable        AIC        SBC       SBIC        R2       Adj. R2 
-------------------------------------------------------------------------
 0      Base Model    238.070    240.873    150.783    0.00000    0.00000 
 1      X1            205.764    209.967    120.987    0.68131    0.66993 
 2      X3            205.139    210.744    121.094    0.70802    0.68639 
 3      X6            205.276    212.282    122.161    0.72559    0.69393 
-------------------------------------------------------------------------

Final Model Output 
------------------

                         Model Summary                          
---------------------------------------------------------------
R                       0.852       RMSE                 6.269 
R-Squared               0.726       MSE                 39.304 
Adj. R-Squared          0.694       Coef. Var           10.419 
Pred R-Squared          0.642       AIC                205.276 
MAE                     5.317       SBC                212.282 
---------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 
 AIC: Akaike Information Criteria 
 SBC: Schwarz Bayesian Criteria 

                               ANOVA                                 
--------------------------------------------------------------------
                Sum of                                              
               Squares        DF    Mean Square      F         Sig. 
--------------------------------------------------------------------
Regression    3117.858         3       1039.286    22.917    0.0000 
Residual      1179.109        26         45.350                     
Total         4296.967        29                                    
--------------------------------------------------------------------

                                  Parameter Estimates                                    
----------------------------------------------------------------------------------------
      model      Beta    Std. Error    Std. Beta      t        Sig      lower     upper 
----------------------------------------------------------------------------------------
(Intercept)    13.578         7.544                  1.800    0.084    -1.929    29.084 
         X1     0.623         0.118        0.681     5.271    0.000     0.380     0.866 
         X3     0.312         0.154        0.301     2.026    0.053    -0.005     0.629 
         X6    -0.187         0.145       -0.158    -1.291    0.208    -0.485     0.111 
----------------------------------------------------------------------------------------

# 이론파트에서 말했듯 봐야할건 AIC 감소량

# Step 0,1,2에선 계속 줄지만 3에서는 는다.

# X1, X3정도까지만 변수를 취하면 될것 같다.

 

# 추가적으로 ANOVA sig가 0이라 좋다.

# Parameter Estimates의 sig는 X6빼고(유의수준 0.05기준) 좋다.

# 실은 X3는 유의수준 0.05기준 살짝 넘는다.

# 그외의 데이터를 봤을땐 유의미하고 미세한 차이라 도메인 지식을 보고 판단하는게 좋을것으로 보인다.

# 그러니 판단을 유보

 

plot(forward)

전진

 

# 겸사겸사 도식화

 

 

# 2. 후진선택법

backward <- ols_step_backward_p(reg, p_val = 0.3)
print(backward)




                             Stepwise Summary                              
-------------------------------------------------------------------------
Step    Variable        AIC        SBC       SBIC        R2       Adj. R2 
-------------------------------------------------------------------------
 0      Full Model    210.500    221.709    129.439    0.73260    0.66285 
 1      X5            208.589    218.397    126.878    0.73181    0.67594 
 2      X4            206.863    215.271    124.447    0.72934    0.68604 
 3      X2            205.276    212.282    122.161    0.72559    0.69393 
-------------------------------------------------------------------------

Final Model Output 
------------------

                         Model Summary                          
---------------------------------------------------------------
R                       0.852       RMSE                 6.269 
R-Squared               0.726       MSE                 39.304 
Adj. R-Squared          0.694       Coef. Var           10.419 
Pred R-Squared          0.642       AIC                205.276 
MAE                     5.317       SBC                212.282 
---------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 
 AIC: Akaike Information Criteria 
 SBC: Schwarz Bayesian Criteria 

                               ANOVA                                 
--------------------------------------------------------------------
                Sum of                                              
               Squares        DF    Mean Square      F         Sig. 
--------------------------------------------------------------------
Regression    3117.858         3       1039.286    22.917    0.0000 
Residual      1179.109        26         45.350                     
Total         4296.967        29                                    
--------------------------------------------------------------------

                                  Parameter Estimates                                    
----------------------------------------------------------------------------------------
      model      Beta    Std. Error    Std. Beta      t        Sig      lower     upper 
----------------------------------------------------------------------------------------
(Intercept)    13.578         7.544                  1.800    0.084    -1.929    29.084 
         X1     0.623         0.118        0.681     5.271    0.000     0.380     0.866 
         X3     0.312         0.154        0.301     2.026    0.053    -0.005     0.629 
         X6    -0.187         0.145       -0.158    -1.291    0.208    -0.485     0.111 
----------------------------------------------------------------------------------------

# 전체 모델에서 X5,X4,X2까지 없애면 좋다고 한다.

# ANOVA sig는 이번에도 0이라 좋다.

# 개별 sig는 X6은 기각하는게 좋을 것이다.

# (아참 참고로 Parameter Estimates에 나오는 변수들은 살아남은 변수들이 등장한다.

# 위와 다르게 이상하게 출력된게 아니다!)

 

plot(backward)

후진

 

 

# 3. 단계적 방법

stepwise <- ols_step_both_p(reg, p_enter = 0.3, p_remove = 0.3)
print(stepwise)




                             Stepwise Summary                              
-------------------------------------------------------------------------
Step    Variable        AIC        SBC       SBIC        R2       Adj. R2 
-------------------------------------------------------------------------
 0      Base Model    238.070    240.873    150.783    0.00000    0.00000 
 1      X1 (+)        205.764    209.967    120.987    0.68131    0.66993 
 2      X3 (+)        205.139    210.744    121.094    0.70802    0.68639 
 3      X6 (+)        205.276    212.282    122.161    0.72559    0.69393 
-------------------------------------------------------------------------

Final Model Output 
------------------

                         Model Summary                          
---------------------------------------------------------------
R                       0.852       RMSE                 6.269 
R-Squared               0.726       MSE                 39.304 
Adj. R-Squared          0.694       Coef. Var           10.419 
Pred R-Squared          0.642       AIC                205.276 
MAE                     5.317       SBC                212.282 
---------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 
 AIC: Akaike Information Criteria 
 SBC: Schwarz Bayesian Criteria 

                               ANOVA                                 
--------------------------------------------------------------------
                Sum of                                              
               Squares        DF    Mean Square      F         Sig. 
--------------------------------------------------------------------
Regression    3117.858         3       1039.286    22.917    0.0000 
Residual      1179.109        26         45.350                     
Total         4296.967        29                                    
--------------------------------------------------------------------

                                  Parameter Estimates                                    
----------------------------------------------------------------------------------------
      model      Beta    Std. Error    Std. Beta      t        Sig      lower     upper 
----------------------------------------------------------------------------------------
(Intercept)    13.578         7.544                  1.800    0.084    -1.929    29.084 
         X1     0.623         0.118        0.681     5.271    0.000     0.380     0.866 
         X3     0.312         0.154        0.301     2.026    0.053    -0.005     0.629 
         X6    -0.187         0.145       -0.158    -1.291    0.208    -0.485     0.111 
----------------------------------------------------------------------------------------

# X1, X3을 추가하고 끝내는게 좋겠다.

# AIC가 x6을 추가할때 증가하기 때문이다.

 

# 전체 sig는 0이라 좋고,

# 개별 sig로 보아 X6은 제거, X3은 상황보고 판단하는게 좋겠다.


plot(stepwise)

 

 

 

# 아참 print한 결과에서

# Variable옆에 (+)가 나오면 더하는게 좋다는 것이고, (-)는 빼는게 좋다는것이다.

# 유의!! 같은게 더하고 이후에 빼는게 좋다고 나올수도 있다!!!

반응형