看这个线性回归: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.zoo
和lag.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.zoo
与lag.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
流明
lm
对zoo
一无所知,将完全忽略时间索引。 如果您不想忽略它,即您希望在运行回归之前对齐所涉及的序列,请使用 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.zooreg
和 help(package = dyn)
注2:如果滞后的方向似乎令人困惑,您可以定义自己的函数并使用它来代替lag
。 例如,这给出了与上面显示的 lm 输出相同的系数:
Lag <- function(x, k = 1) lag(x, -k)
dyn$lm(y ~ zr + Lag(zr))
另一个警告是,与与 R 核心一致的lag.zoo
和lag.zooreg
不同,xts 包中的lag.xts
不一致。 此外,dplyr中的lag
也是不一致的(如果你加载dplyr,情况更糟,那么dplyr将使用自己不一致的lag
版本屏蔽R中的lag
。 另请注意,dynlm 中的L
与 Lag
相同,但明智地使用了不同的名称以避免混淆。
先查阅手册:
描述
计算时间序列的滞后版本,将时基向后移动给定数量的观测值。
默认 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