我对回归分析中滞后的 R 实现感到困惑

i am confused with the R implementation of lag in Regression analysis

看这个线性回归: Y ~ X + lag(X,1) ,意思很明显就是在做线性回归。 lag(X,1) 表示 X 的第一个滞后。令我困惑的是滞后函数的 R 实现。在 R 中,lag(X, 1) 将 X 移动到先前时间,例如

>library(zoo) 
>
>str(zoo(x))
‘zoo’ series from 1 to 4 
Data: num [1:4] 11 12 13 14
Index:int [1:4] 1 2 3 4
>lag(zoo(x))
1  2  3
12 13 14

当你回归时,R 在时间 2 恰好使用哪个值?我猜 R 使用这样的数据:

time 1   2   3   4
 Y      anything
 X   11  12  13  14
lagX 12  13  14

但这是无稽之谈!因为我们应该使用X和当前X在时间2(或任何特定时间)的第一个滞后时间,即 11 和 12 ,而不是上面的 13 12 ! X 的第一个滞后应该是之前的 X ,不是吗?我感到很困惑!请解释一下,非常感谢。

问题开头为:

look at this linear regression: Y ~ X + lag(X,1) ,the meaning is very clear that it is trying to do a linear regression. and the lag(X,1) means the first lag of X

其实不然。不是指这个型号:

Y[i] = a + b * X[i] + c * X[i-1] + error[i]

其实是指这个型号:

Y[i] = a + b * X[i] + c * X[i+1] + error[i]

这不太可能是您想要的。

您可能想要 lag(X, -1) 而不是 lag(X, 1)。在 R 中滞后一个序列意味着滞后序列开始得更早,这意味着序列本身向前移动。

另一个需要注意的是lm没有对齐序列。它对时间索引一无所知。您将需要自己对齐系列或使用为您完成的包。

下面将详细介绍这些要点。

ts

首先让我们从 R 的核心考虑 lag.ts,因为 lag.zoolag.zooreg 是基于它并与之一致的。 lag.ts 滞后于系列的时间,以便滞后的系列更早开始。也就是说,如果我们有一个序列,其值在时间 1、2、3 和 4 分别为 11、12、13 和 14 lag.ts 每次都滞后,以便滞后序列具有相同的值 11、12、13 和14,但时间为 0、1、2、3。原始系列从 1 开始,但滞后系列从 0 开始。最初值 12 在时间 2,但在滞后系列中,值 13 在时间 2。在代码中,我们有:

tt <- ts(11:14)
cbind(tt, lag(tt), lag(tt, 1), lag(tt, -1))

给出:

Time Series:
Start = 0 
End = 5 
Frequency = 1 
  tt lag(tt) lag(tt, 1) lag(tt, -1)
0 NA      11         11          NA
1 11      12         12          NA
2 12      13         13          11
3 13      14         14          12
4 14      NA         NA          13
5 NA      NA         NA          14

动物园

lag.zoolag.ts一致。请注意,由于 zoo 代表不规则间隔的系列,它不能假设时间 0 在时间 1 之前。如果我们知道系列是规则间隔的,我们只能做出这样的假设。因此,如果时间 1 是系列中最早的时间,则此时的值将被丢弃,因为无法确定将其滞后到哪个更早的时间。新的滞后序列现在从原始序列中的第二个时间值开始。这类似于 lag.ts 示例,只是在 lag.ts 中有一个 0 时间,而在这个示例中没有这样的时间。同样,我们也不能将时间尺度向前扩展。

library(zoo)
z <- zoo(11:14)
merge(z, lag(z), lag(z, 1), lag(z,-1))

给予:

   z lag(z) lag(z, 1) lag(z, -1)
1 11     12        12         NA
2 12     13        13         11
3 13     14        14         12
4 14     NA        NA         13

zooreg

zoo 包确实有一个 zooreg class,它假设除了一些缺失值之外有规律地间隔系列,它可以像 ts 一样推断出之前发生的事情。使用 zooreg 可以推断出时间 0 在之前,时间 5 在之后。

library(zoo)
zr <- zooreg(11:14)
merge(zr, lag(zr), lag(zr, 1), lag(zr,-1))

给予:

  zr lag(zr) lag(zr, 1) lag(zr, -1)
0 NA      11         11          NA
1 11      12         12          NA
2 12      13         13          11
3 13      14         14          12
4 14      NA         NA          13
5 NA      NA         NA          14

lm

lmzoo 一无所知,将完全忽略时间索引。如果你不想忽略它,即你想在 运行 回归之前对齐所涉及的系列,请使用 dyn(或 dynlm)包。使用前者:

library(dyn)
set.seed(123)
zr <- zooreg(rnorm(10))
y <- 1 + 2 * zr + 3 * lag(zr, -1)
dyn$lm(y ~ zr + lag(zr, -1))

给予:

Call:
lm(formula = dyn(y ~ zr + lag(zr, -1)))

Coefficients:
(Intercept)           zr  lag(zr, -1)  
          1            2            3  

注1:务必阅读帮助文件中的文档:?lag.ts?lag.zoo?lag.zooreghelp(package = dyn)

注 2: 如果滞后的方向看起来令人困惑,您可以定义自己的函数并使用它代替 lag。例如,这给出了与上面显示的 lm 输出相同的系数:

Lag <- function(x, k = 1) lag(x, -k)
dyn$lm(y ~ zr + Lag(zr))

额外的警告是,不像 lag.zoolag.zooreg 与 R 的核心一致,来自 xts 包的 lag.xts 是不一致的。此外,dplyr 中的 lag 也不一致(更糟糕的是,如果加载 dplyr,则 dplyr 将使用其自身不一致的 lag 版本屏蔽 R 中的 lag。还要注意 [= dynlm 中的 45=] 与 Lag 的工作原理相同,但明智地使用了不同的名称以避免混淆。

请先咨询manual

Description

Compute a lagged version of a time series, shifting the time base back by a given number of observations.

Default S3 method:

lag(x, k = 1, ...)

Arguments

x A vector or matrix or univariate or multivariate time series

k The number of lags (in units of observations).

因此,lag 不是 return 滞后值。它 return 是整个滞后时间序列,向后移动了一些 k。这不是一个简单的 lm 可以使用的东西,实际上也不是你想要使用的东西。然而,这对我有用:

library(zoo)

x <- zoo(c(11, 12, 13, 14))
y <- c(1, 2.3, 3.8, 4.2)

lagged <- lag(x, -1)
lagged <- c(lagged, c=0) # first lag is defined as zero

model <- lm(y ~ x + lagged)
summary(model)

Returns:

Call:
lm(formula = y ~ x + lagged)

Residuals:
         1          2          3          4 
-8.327e-17 -1.833e-01  3.667e-01 -1.833e-01 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.86333    4.20149  -2.110    0.282
x            0.89667    0.38456   2.332    0.258
lagged       0.05333    0.08199   0.650    0.633

Residual standard error: 0.4491 on 1 degrees of freedom
Multiple R-squared:  0.9687,    Adjusted R-squared:  0.9062 
F-statistic: 15.49 on 2 and 1 DF,  p-value: 0.1769