普通向量 lag 是一个泛型,这意味着它可以对不同类的对象产生不同的作用。在这里,我们将只讨论它如何与普通向量一起工作,但在最后两节中,我们还将讨论"ts"、"zoo"(和"zooreg")类对象以及它们是如何滞后的。例如,我们使用这个值向量:
x <- c(11, 12, 13, 14)
tsp 意识到时间序列是时间序列和这些时间的值。这里我们只有值但没有时间,所以lag 在概念上通过添加一个 tsp 属性添加规则间隔的默认时间 1、2、3、4,该属性是一个三元组,编码开始时间、结束时间和频率(即连续时间之间距离的倒数)。我们可以将时间 1、2、3、4 编码为 tsp 属性 c(1, 4, 1)。 1是开始时间。 4是结束时间。时间点相隔 1(因为时间差 2-1、3-2 和 4-3 各等于 1)且 1/1 = 1,因此频率为 1。以年为单位的季度序列将具有频率为 4,因为每个连续的季度相隔 0.25 且 1/0.25 = 4。类似地,以年为单位的月度序列的频率为 12。
滞后 lag 将时间向后移动。它不会改变价值观,只会改变时代。因此,滞后将tsp 属性从c(1, 4, 1) 更改为c(0, 3, 1)。开始时间从 1 偏移到 0,结束时间从 4 偏移到 3,由于偏移不改变频率,所以频率保持为 1。
> lag(x)
[1] 11 12 13 14
attr(,"tsp")
[1] 0 3 1
time time 函数将生成一个对象,其值为参数的时间,其 tsp 属性与其参数的 tsp 属性相同(或默认值) tsp 属性(如果没有)。例如,正如我们已经讨论过的,下面的代码显示上面给出的普通向量 x 的时间是 1、2、3、4,lag(x) 的时间是 0、1、2、3。
> time(x)
[1] 1 2 3 4
attr(,"tsp")
[1] 1 4 1
> time(lag(x))
[1] 0 1 2 3
attr(,"tsp")
[1] 0 3 1
ts 对普通向量的大多数操作都会忽略tsp 属性,因此除非您对其进行处理,否则它的存在可能毫无意义。另一方面,如果对象是"ts" 类对象,那么对"ts" 对象的各种操作都需要注意tsp 属性。例如,请注意这些图的开始位置:
# plain vector
plot(x) # plot starts at time = 1
plot(lag(x)) # same, tsp was ignored
# ts object
plot(ts(x)) # plot starts at time = 1
plot(lag(ts(x))) # plot starts at time = 0, tsp was not ignored
zoo 上面的系列是有规律的间隔,即连续时间之间的差异是相同的。要表示不规则间隔的系列,可以使用 zoo 包中的 "zoo" 和 "zooreg" 类。 zoo 对象是具有 index 属性的值,其中包含时间。时间未编码在 tsp 属性中。例如,这里我们看到 zoo 对象的时间为 1、2、3、4,值为 11、12、13、14:
> 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
"zooreg" 类类似于 "zoo" 用于规则间隔的对象,除了某些可以省略的时间。在内部"zooreg" 对象与"zoo" 对象相同,除了频率也被存储。值和索引与动物园相同,但我们知道也有一个频率。由于连续的时间点相隔 1,因此频率为 1。
> str(zooreg(x))
‘zooreg’ series from 1 to 4
Data: num [1:4] 11 12 13 14
Index: num [1:4] 1 2 3 4
Frequency: 1
如果一个对象滞后于"zoo" 对象,那么每次都会移动到前一个时间,而第一次会被丢弃。这里时间是 1、2、3,值是 12、13、14。请注意,滞后序列具有原始序列时间的子集。落后于动物园系列时总是如此:
> lag(zoo(x))
1 2 3
12 13 14
因为"zooreg" 对象具有频率,所以它们可能会滞后于原始系列中不存在的时间。每个时间点 t 滞后于 t - deltat,其中 deltat 是 1/频率。这里0、1、2、3为滞后时间点,取值为11、12、13、14:
> lag(zooreg(x))
0 1 2 3
11 12 13 14
dplyr dplyr 包有一个lag 函数。不幸的是,它的作用与基本 R lag 函数的方向相反,lag(x, k) 将系列中的每个项目向前而不是向后移动。这实际上可能更直观,但由于与基本 R 不兼容而导致很多混乱。如果您使用 dplyr,请非常小心,您知道是否加载了 dplyr。
dplyr 的lag 在与数据帧一起使用时特别有用,因为给定一个向量(例如数据帧的一列),它总是返回一个相同长度的向量。它有一个 default= 参数,它本身默认为 NA,但可以由用户指定,以确定要填充向量开头的空值。不允许负滞后,但可以使用 dplyr lead 函数。
dplyr::lag(1:5)
## [1] NA 1 2 3 4
dplyr::lag(1:5, 2)
## [1] NA NA 1 2 3
dplyr::lead(1:5)
## [1] 2 3 4 5 NA