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

  • 本文关键字:实现 滞后 回归 r regression lag
  • 更新时间 :
  • 英文 :


看这个线性回归:Y ~ X + lag(X,1(,意思很明确,就是在尝试做线性回归。 而 lag(X,1( 表示 X 的第一个滞后。让我感到困惑的是滞后函数的 R 实现。例如,滞后(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,不是吗?我好糊涂!请向我解释,非常感谢。

问题开始于:

看看这个线性回归:Y~X+滞后(X,1(,意思很清楚 它正在尝试进行线性回归。滞后 (X,1( 表示第一个 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滞后于序列的时间,以便滞后系列更早开始。 也就是说,如果我们有一个系列,其值分别为 11、12、13 和 14,时间分别为 1、2、3 和 4 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

佐雷格

zoo 包确实有一个 zooreg 类,它假设除了一些缺失值之外的规则间隔序列,它可以像 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

流明

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))

另一个警告是,与与 R 核心一致的lag.zoolag.zooreg不同,xts 包中的lag.xts不一致。 此外,dplyr中的lag也是不一致的(如果你加载dplyr,情况更糟,那么dplyr将使用自己不一致的lag版本屏蔽R中的lag。 另请注意,dynlm 中的LLag 相同,但明智地使用了不同的名称以避免混淆。

先查阅手册:

描述

计算时间序列的滞后版本,将时基向后移动给定数量的观测值。

默认 S3 方法:

滞后(x, k = 1, ...(

参数

x 向量或矩阵或单变量或多变量时间序列

k 滞后次数(以观测单位为单位(。

因此,lag 不会返回滞后值。它返回整个滞后时间序列,向后移动了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)

返回:

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

最新更新