【问题标题】:What does lag function in R do?R中的滞后函数有什么作用?
【发布时间】:2021-02-07 04:18:29
【问题描述】:

我正在调试 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 的程序员而不是统计学家。

【问题讨论】:

  • 你读过?lag吗?什么不清楚?
  • “计算时间序列的滞后版本,将时间基准向后移动给定的观察次数。” . .我认为stackoverflow是为了澄清事情而不是指向文档
  • 这是为了澄清事情,但是当你如此模糊时,我们怎么知道你在困惑什么? “我对这个函数的工作原理感到困惑”和“这个函数有什么作用?”不是很具体。明确说明不清楚或没有意义的地方,人们会更有可能帮助您。
  • 人们在无法自己解决问题时提出问题。如果有人想回答,请回答或让其他人回答,而不是证明不应该问这个问题。
  • 是的,当人们无法自己解决问题时会提出问题,但您还没有证明您已经尝试过任何事情。文档中有一个示例,searching for [r] lag 产生了一些非常有用的结果。

标签: r time-series


【解决方案1】:

普通向量 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

【讨论】:

    【解决方案2】:

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

    示例(@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) 是如何保持不变的,但时间序列的 StartEnd 属性 被修改为期待滞后。为此,您需要一个能够理解 R 的 ts 对象的函数。如果使用其他东西,您可能需要自己滞后矢量。

    【讨论】:

    • 您描述的是返回对象的tsp 属性,而不是返回对象本身。
    • 让我困惑了好几年并让我再也不想使用 R ts 对象的领域是,滞后并没有真正改变向量,而是改变了时基.这不是我的预期。
    • 如果您从他们的示例中将x 设为ts 对象以与滞后创建的对象进行比较,那么也许OP 会更容易理解正在发生的事情。那么很明显,向量是不变的,只是每个观察所链接的时间单位t被修改了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多