Use of lag() function
0 Before start
해당 튜토리얼이 제공되는 곳: https://github.com/be-favorite/Multiple_timeseries
R은 다양한 시계열 객체를 제공하며, 각 객체에 따라 lag() 함수를 이용한 모형 적합의 결과가 조금씩 달라짐을 유의해야 합니다. 이번 튜토리얼을 통해 R의 시계열 객체들인 ts
와 xts
(extensible time-series)(또는 zoo
객체)에 대해 lag()
의 모형 적합 결과가 어떻게 다른지 알아두시기 바랍니다.
1 lag() in the ts object
먼저 난수을 통해 ts
객체를 생성합니다.
set.seed(123)
<- ts(rnorm(10))
y <- ts(rnorm(10))
x x
## Time Series:
## Start = 1
## End = 10
## Frequency = 1
## [1] 1.2240818 0.3598138 0.4007715 0.1106827 -0.5558411 1.7869131
## [7] 0.4978505 -1.9666172 0.7013559 -0.4727914
다음으로 x
에 대해 lag()
를 수행합니다.
lag(x) # same as lag(x, 1L)
## Time Series:
## Start = 0
## End = 9
## Frequency = 1
## [1] 1.2240818 0.3598138 0.4007715 0.1106827 -0.5558411 1.7869131
## [7] 0.4978505 -1.9666172 0.7013559 -0.4727914
ts
객체인 x
가 lag()
를 통해 1 시차 앞으로 당겨졌습니다. 바로 모형 적합을 수행하여 비교해보겠습니다.
summary(lm(y ~ x))
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.1740 -0.3351 -0.0554 0.4035 1.3821
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.03609 0.26694 -0.135 0.8958
## x 0.53071 0.26517 2.001 0.0803 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8258 on 8 degrees of freedom
## Multiple R-squared: 0.3336, Adjusted R-squared: 0.2503
## F-statistic: 4.006 on 1 and 8 DF, p-value: 0.08034
summary(lm(y ~ lag(x)))
##
## Call:
## lm(formula = y ~ lag(x))
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.1740 -0.3351 -0.0554 0.4035 1.3821
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.03609 0.26694 -0.135 0.8958
## lag(x) 0.53071 0.26517 2.001 0.0803 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8258 on 8 degrees of freedom
## Multiple R-squared: 0.3336, Adjusted R-squared: 0.2503
## F-statistic: 4.006 on 1 and 8 DF, p-value: 0.08034
결과가 정확하게 똑같습니다. 즉, ts
객체로 lm()
을 통해 회귀를 수행하면 해당 객체의 start와 end를 캐치하지 못합니다. 그래서, ts
객체를 이용한 분배시차모형, 동적회귀모형 등의 적합은 dynlm{dynlm}
을 통해 수행해야 합니다. 해당 함수는 L()
을 이용하여 예측변수로 사용 될 전 시차를 지정해주면 됩니다. 다만, L()
은 시차를 앞이 아닌 뒤로 당깁니다. 따라서, L(x, -1L)
은 lag(x, 1L)
과 같습니다. x
를 앞으로 한 칸 당겨 분포시차모형을 적용해보겠습니다.
library(dynlm)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
dynlm(y ~ L(x, -1L)) # same as y ~ L(x, 1L) or y ~ lag(x, 1)
##
## Time series regression with "ts" data:
## Start = 1, End = 9
##
## Call:
## dynlm(formula = y ~ L(x, -1L))
##
## Coefficients:
## (Intercept) L(x, -1)
## 0.13981 -0.07704
2 lag() in the xts object
xts
객체에서는 lag() 함수가 어떻게 동작하는지 알아보고 튜토리얼을 마무리하겠습니다.
library(xts)
<- xts(y, as.Date(1:10))
y_xts <- xts(x, as.Date(1:10))
x_xts class(x_xts)
## [1] "xts" "zoo"
x_xts
객체는 xts
, zoo
객체에 해당합니다. 해당 객체에 대해 lag()
를 수행하면 ts
객체와는 달리 한 시차 뒤로 이동하게됩니다. 즉, \(x_{t+1}\)에 해당합니다:
lag(x_xts)
## [,1]
## 1970-01-02 NA
## 1970-01-03 1.2240818
## 1970-01-04 0.3598138
## 1970-01-05 0.4007715
## 1970-01-06 0.1106827
## 1970-01-07 -0.5558411
## 1970-01-08 1.7869131
## 1970-01-09 0.4978505
## 1970-01-10 -1.9666172
## 1970-01-11 0.7013559
그리고, xts
객체의 경우 lm()
으로 회귀모형을 적합해도 해당 객체의 start와 end를 캐치할 수 있습니다. 즉, lm(y_xts ~ lag(x_xts))
의 결과는 dynlm(y ~ L(x, 1L))
과 동일할 것입니다.
lm(y_xts ~ lag(x_xts))
##
## Call:
## lm(formula = y_xts ~ lag(x_xts))
##
## Coefficients:
## (Intercept) lag(x_xts)
## 0.13811 0.02492
dynlm(y ~ L(x, 1L))
##
## Time series regression with "ts" data:
## Start = 2, End = 10
##
## Call:
## dynlm(formula = y ~ L(x, 1L))
##
## Coefficients:
## (Intercept) L(x, 1)
## 0.13811 0.02492
해당 튜토리얼을 참고하여 lag()
를 이용한 모형 적합 진행 시, 주의를 기울여 진행하시기 바랍니다.😊
3 References
- 나종화, R 응용 시계열분석, 자유아카데미(2020)