时间序列的滞后回归

问题描述

我有一个时间序列,我尝试使用滞后回归量回归因变量。我知道我可以使用以下公式在一次观察的滞后中做到这一点:

library(dyn)

set.seed(123)
y <- numeric(100)
y[1] <- 2
for (i in 2:100) {
  u <- rnorm(1,mean = 0,sd = 1)
  y[i] <- 1 + 0.5 * y[i-1] + u
}

z <- zoo(y)
model <- dyn$lm(z ~ lag(z,-1))

一个函数是否有可能使用 1 到 12 个观测值的滞后回归量创建 12 个回归模型,或者我是否需要进行 12 个单独的回归以获得 OLS 回归的解?

解决方法

下面我展示了使用 for 循环和 purrr::map 的迭代。

# OP's code
library(dyn)
#> Loading required package: zoo
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date,as.Date.numeric
set.seed(123)
y <- numeric(100)
y[1] <- 2
for (i in 2:100) {
  u <- rnorm(1,mean = 0,sd = 1)
  y[i] <- 1 + 0.5 * y[i-1] + u
}
z <- zoo(y)

# for-loop version 
x <- list()
for(i in 1:12){
  x[[i]] <- dyn$lm(z ~ lag(z,-i))
}
x[[9]]
#> 
#> Call:
#> lm(formula = dyn(z ~ lag(z,-i)))
#> 
#> Coefficients:
#> (Intercept)   lag(z,-i)  
#>      2.3920      -0.1101

# purrr-based version
library(purrr)
x <- map(1:12,~ dyn$lm(z ~ lag(z,-.x)))
x[[9]]
#> 
#> Call:
#> lm(formula = dyn(z ~ lag(z,-.x)))
#> 
#> Coefficients:
#> (Intercept)  lag(z,-.x)  
#>      2.3920      -0.1101

reprex package (v2.0.0) 于 2021 年 7 月 28 日创建

,

没有 purrr 的替代方案:

x <- lapply(1:12,function(x) dyn$lm(z ~ lag(z,- x)))
x_2[[9]]
#> 
#> Call:
#> lm(formula = dyn(z ~ lag(z,-x)))
#> 
#> Coefficients:
#> (Intercept)   lag(z,-x)  
#>      2.3920      -0.1101