我对回归分析中滞后的 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.zoo
和 lag.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.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
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
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))
额外的警告是,不像 lag.zoo
和 lag.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
看这个线性回归: 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.zoo
和 lag.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.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
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
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))
额外的警告是,不像 lag.zoo
和 lag.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