R中的滞后函数有什么作用?

时间:2014-08-25 18:31:53

标签: r time-series

我正在调试R代码,我对R中lag函数的工作原理感到困惑。例如

> x=c(0)
> x
[1] 0
> lag(x)
[1] 0
attr(,"tsp")
[1] 0 0 1

另一个例子

> x=c(0,0,0,1)
> x
[1] 0 0 0 1
> lag(x)
[1] 0 0 0 1
attr(,"tsp")
[1] 0 3 1

有人可以用简单的英语解释我lag函数究竟是做什么的。

我特别关注如何计算返回值。

请记住,这个问题来自程序员,他们试图学习R而不是统计学家。

2 个答案:

答案 0 :(得分:10)

普通向量 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函数将生成一个对象,其值是其参数的时间,其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""zooreg"类。 zoo对象是具有保持时间的index属性的值。时间不以tsp属性编码。例如,在这里我们看到动物园对象的持有时间为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&#39; s 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

答案 1 :(得分:9)

lag采用原子向量并返回相同的向量,其中添加了三个数字的属性,表示您提供的向量上的长度为1的延迟的开始,结束和频率。 R中的向量从1开始索引,因此长度为1的滞后的起始值为0,在您的情况下,结尾为3(向量的长度的一个短)。最后,frequency指定应该将多少元素归因于每个索引。

示例(由@GavinSimpson提供)

x <- ts(c(0,0,0,1))
x
lag(x)

> x
Time Series:
Start = 1 
End = 4 
Frequency = 1 
[1] 0 0 0 1
> lag(x)
Time Series:
Start = 0 
End = 3 
Frequency = 1 
[1] 0 0 0 1

注意向量([1] 0 0 0 1)如何保持不变,但时间序列开始结束属性被修改为人们会期待一个滞后。为了使用它,您需要一个能够理解R ts个对象的函数。如果使用其他东西,您可能需要自己滞后于矢量。