Use of lag() function


0 Before start


해당 튜토리얼이 제공되는 곳: https://github.com/be-favorite/Multiple_timeseries

R은 다양한 시계열 객체를 제공하며, 각 객체에 따라 lag() 함수를 이용한 모형 적합의 결과가 조금씩 달라짐을 유의해야 합니다. 이번 튜토리얼을 통해 R의 시계열 객체들인 tsxts(extensible time-series)(또는 zoo 객체)에 대해 lag()의 모형 적합 결과가 어떻게 다른지 알아두시기 바랍니다.

1 lag() in the ts object


먼저 난수을 통해 ts 객체를 생성합니다.

set.seed(123)
y <- ts(rnorm(10))
x <- ts(rnorm(10))
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객체인 xlag()를 통해 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)
y_xts <- xts(y, as.Date(1:10))
x_xts <- xts(x, as.Date(1:10))
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)