모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!
🕑 시계열 회귀분석
서로 다른 개체 간 오차항들은 서로 자기상관이 없다는 가정의 영향을 고려해줘야 합니다.
특히 시계열 데이터의 특성 상, 각 개체 간 자기상관이 없을 수 없기 때문에 꼭 이에 대한 처리를 해주어야 합니다.
대표적으로, 차분을 진행해서 자기상관을 줄이는 방법이 있겠습니다.
🕑 선형회귀 : lm(Y ~ X1 + X2 + X3, data = DATA)
🕑 먼저, 일반 데이터프레임에 대해 회귀분석을 진행하겠습니다.
## 데이터프레임
head(df1)
## year consumption income wealth interest lnconsump lndpi lnwealth
## 1 1947 976.4 1035.2 5166.815 -10.350940 6.883873 6.942350 8.550012
## 2 1948 998.1 1090.0 5280.757 -4.719804 6.905853 6.993933 8.571825
## 3 1949 1025.3 1095.6 5607.351 1.044063 6.932741 6.999057 8.631834
## 4 1950 1090.9 1192.7 5759.515 0.407346 6.994758 7.083975 8.658608
## 5 1951 1107.1 1227.0 6086.056 -5.283152 7.009499 7.112328 8.713756
## dlnconsump dlndpi dlnwealth dinterest rlnconsump rlndpi
## 1 NA NA NA NA NA NA
## 2 0.021980762 0.051583290 2.181339e-02 5.63113594 4.670862 4.739956
## 3 0.026887417 0.005124092 6.000900e-02 5.76386690 4.690612 4.728332
## 4 0.062017441 0.084917545 2.677441e-02 -0.63671696 4.743900 4.811586
## 5 0.014740944 0.028352737 5.514717e-02 -5.69049835 4.738506 4.812368
## rlnwealth rinterest dconsump dincome dwealth rconsump
## 1 NA NA NA NA NA NA
## 2 5.795887 -1.35915709 21.699951 54.800049 1.139419e+02 704.3560
## 3 5.848814 2.57644486 27.200073 5.599976 3.265942e+02 725.0278
## 4 5.856105 0.06836937 65.599976 97.099976 1.521641e+02 782.4448
## 5 5.902559 -5.41540527 16.199951 34.300049 3.265410e+02 778.9094
## rincome rwealth rinterest2 time
## 1 NA NA NA 1
## 2 778.5664 3726.352 -1.60578680 2
## 3 767.6801 4018.668 2.46398711 3
## 4 863.0954 4072.578 0.09324604 4
## 5 868.1835 4353.341 -5.40569973 5
class(df1)
## [1] "data.frame"
model1 <- lm(lnconsump ~ lndpi + lnwealth + interest, data = df1)
summary(model1)
##
## Call:
## lm(formula = lnconsump ~ lndpi + lnwealth + interest, data = df1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.018441 -0.010001 0.000337 0.007038 0.032579
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.4677120 0.0427780 -10.933 7.33e-15 ***
## lndpi 0.8048728 0.0174978 45.998 < 2e-16 ***
## lnwealth 0.2012702 0.0175926 11.441 1.43e-15 ***
## interest -0.0026891 0.0007619 -3.529 0.000905 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01193 on 50 degrees of freedom
## Multiple R-squared: 0.9996, Adjusted R-squared: 0.9995
## F-statistic: 3.783e+04 on 3 and 50 DF, p-value: < 2.2e-16
🕑 이번에는 ts 데이터로 변환해서 회귀분석을 진행하겠습니다.
세부적으로 데이터의 요인을 파악하고 이를 고려한 분석을 진행해 보겠습니다.
## ts 데이터로 변환
df1.ts <- ts(df1[, 2:8], start = 1947, frequency = 1)
head(df1.ts)
## Time Series:
## Start = 1947
## End = 2000
## Frequency = 1
## consumption income wealth interest lnconsump lndpi lnwealth
## 1947 976.4 1035.2 5166.815 -10.350940 6.883873 6.942350 8.550012
## 1948 998.1 1090.0 5280.757 -4.719804 6.905853 6.993933 8.571825
## 1949 1025.3 1095.6 5607.351 1.044063 6.932741 6.999057 8.631834
## 1950 1090.9 1192.7 5759.515 0.407346 6.994758 7.083975 8.658608
## 1951 1107.1 1227.0 6086.056 -5.283152 7.009499 7.112328 8.713756
is.ts(df1.ts)
## [1] TRUE
가장 먼저 확인해야 하는 plot은 time plot입니다!!
time plot에서 확인할 점은 각 변수의 트렌드, 계절성, 툭 떨어졌다가 올라가는 부분이 있는지의 여부입니다.
• 만약 떨어진 부분이 있으면 이유를 파악하고 제대로 된 데이터인지 확인해야 합니다.
• 또한 월별 데이터인데도 seasonality가 없다면 계절조정이 된 데이터인지 반드시 확인해야 합니다.
• 어느 column에는 계절성이 있고, 다른 column에는 없으면 이 데이터는 쓰면 안됩니다. 혹은 사용할 부분만 사용합시다.
plot(df1.ts, col = 'red')
plot 결과, 전반적인 데이터의 트렌드가 함께 움직이고 있습니다.
또한 년도별 데이터이므로 눈에 확 띄는 seasonality는 없습니다.
model.ts <- lm(lnconsump ~ lndpi + lnwealth + interest, data = df1.ts)
summary(model.ts)
##
## Call:
## lm(formula = lnconsump ~ lndpi + lnwealth + interest, data = df1.ts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.018441 -0.010001 0.000337 0.007038 0.032579
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.4677120 0.0427780 -10.933 7.33e-15 ***
## lndpi 0.8048728 0.0174978 45.998 < 2e-16 ***
## lnwealth 0.2012702 0.0175926 11.441 1.43e-15 ***
## interest -0.0026891 0.0007619 -3.529 0.000905 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01193 on 50 degrees of freedom
## Multiple R-squared: 0.9996, Adjusted R-squared: 0.9995
## F-statistic: 3.783e+04 on 3 and 50 DF, p-value: < 2.2e-16
R-square 값이 굉장히 높지만, 트렌드가 이유일 수 있으므로 잘못된 값일수도 있습니다.
해당 모형을 사용하려면 몇 가지 장기 균형 관계에 대한 테스트를 거쳐야 합니다.
모델 평가를 위해서 residual plot을 그려보았습니다.
library(lmtest)
plot(model.ts$residuals, type = 'b')
🕑 오차항의 자기상관 파악
모델의 자기상관 차수 파악 : acf(MODEL$residuals)
더빈왓슨 테스트 : dwtest(MODEL) durbinWatsonTest(MODEL, max.lag)
bg 테스트 : bgtest(MODEL, order)
두 테스트의 귀무가설은 자기상관이 없다는 것이므로, p-value가 유의수준보다 작다면 모델에 이상이 있다는 것입니다.
☑️ acf
acf(model.ts$residuals)
☑️ dwtest
## 잔차의 자기상관 검정 : dwtest
## p-value가 0.05보다 작음 -> 귀무가설 기각
## 문제가 없다, 자기상관이 없다는 것이 귀무가설이므로 해당 모델은 문제가 있는 모델임
dwtest(model.ts)
##
## Durbin-Watson test
##
## data: model.ts
## DW = 1.2892, p-value = 0.0009445
## alternative hypothesis: true autocorrelation is greater than 0
☑️ durbinWatsonTest
## 잔차의 자기상관 검정 : durbinWatsonTest
## 1차 자기 상관 외의 다른 자기상관도 확인이 가능함
# install.packages('car')
library(car)
durbinWatsonTest(model.ts, max.lag = 1)
## lag Autocorrelation D-W Statistic p-value
## 1 0.2977555 1.289232 0
## Alternative hypothesis: rho != 0
☑️ bgtest
## p-value가 0.05보다 작기 때문에 자기상관이 없다는 귀무가설을 기각함
bgtest(model.ts, order = 1)
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model.ts
## LM test = 5.312, df = 1, p-value = 0.02118
☑️ bgtest
bgtest(model.ts, order = 3)
##
## Breusch-Godfrey test for serial correlation of order up to 3
##
## data: model.ts
## LM test = 6.6573, df = 3, p-value = 0.08366
여러 검정 수치 비교 결과, 해당 모델은 사용할 수 없습니다.
즉, 오차항의 자기상관 문제를 해결해야 합니다. 대표적으로 차분 등의 방법이 있겠습니다!!
다음 포스팅에서 여러 가지 방법으로 자기상관을 해결해보겠습니다.
'📈📉 비즈니스 어낼리틱스 > 🕑 시계열 분석' 카테고리의 다른 글
🕑시계열데이터 분석 10 - 자기상관 해결 2. 회귀가변수 (2) | 2023.04.20 |
---|---|
🕑시계열데이터 분석 09 - 자기상관 해결 1. 차분 (2) | 2023.04.20 |
🕑시계열데이터 분석 07 - 평활기법 (0) | 2023.04.14 |
🕑시계열데이터 분석 06 - 시계열 데이터 분해 (0) | 2023.04.13 |
🕑시계열데이터 분석 05 - aggregate( ) 함수 (0) | 2023.04.11 |