滚动滞后差异

时间:2017-08-11 19:21:59

标签: r zoo rollapply

好的,我希望在R中创建滚动滞后差异。

vec <- c(43.79979, 44.04865, 44.17308, 44.54638, 44.79524, 44.79524, 44.79524, 44.42195, 44.54638, 44.79524, 44.42195, 43.30206, 43.30206, 43.17764, 43.30206)

> length(vec)
[1] 15

这是我到目前为止所尝试的:

vec1 <- rollapply(vec, width = 2,  fill = NA, FUN = diff)

这给出了这个输出:

[1]  0.24886  0.12443  0.37330  0.24886  0.00000  0.00000 -0.37329  0.12443  0.24886 -0.37329 -1.11989  0.00000 -0.12442  0.12442       NA

> length(vec1)
[1] 15

注意我们在元素15中有一个NA值。

所以我想在滞后时做滞后1,2和3 ...所以上面的代码并不适合这个,所以我尝试下面的内容:

lag1 <- diff(vec, lag = 1, differences = 1, arithmetic = TRUE, na.pad = TRUE)
lag2 <- diff(vec, lag = 2, differences = 1, arithmetic = TRUE, na.pad = TRUE)
lag3 <- diff(vec, lag = 3, differences = 1, arithmetic = TRUE, na.pad = TRUE)
length(lag1)
length(lag2)
length(lag3)

结果:

> lag1
 [1]  0.24886  0.12443  0.37330  0.24886  0.00000  0.00000 -0.37329  0.12443  0.24886 -0.37329 -1.11989  0.00000 -0.12442  0.12442
> lag2
 [1]  0.37329  0.49773  0.62216  0.24886  0.00000 -0.37329 -0.24886  0.37329 -0.12443 -1.49318 -1.11989 -0.12442  0.00000
> lag3
 [1]  0.74659  0.74659  0.62216  0.24886 -0.37329 -0.24886  0.00000  0.00000 -1.24432 -1.49318 -1.24431  0.00000
> length(lag1)
[1] 14
> length(lag2)
[1] 13
> length(lag3)
[1] 12

请注意,当滞后差异超过时......它会将差异结果放在它减去...的值的行上,所以它取了我们当前的值 - 滞后值。它将diff结果放在滞后值位置。然后我们失去了矢量的长度。我想将diff-lagged结果放在起始编号(diff)上,并将前导NA设置为数据集开头的缺失值。

以滞后2为例,这是我想要的结果:

> lag2
 [1]  NA    NA 0.37329  0.49773  0.62216  0.24886  0.00000 -0.37329 -0.24886  0.37329 -0.12443 -1.49318 -1.11989 -0.12442  0.00000

有没有人知道如何纠正这个?

或许可以解释一下:

这是向量的开始:

vec <- c(43.79979, 44.04865, 44.17308..... 

所以,如果我们做了一个滞后的2差异......

我们采用第3个元素...... 44.17308 - 43.79979 = 0.37329的结果。

所以我想要NA NA 0.37329

而不是将0.37329置于新lag2向量中的第一个位置。

1 个答案:

答案 0 :(得分:2)

对于那些寻求tidyverse解决方案的人来说,一种选择是使用dplyr::lag,我发现它比使用base::apply的直观。

    vec - dplyr::lag(vec, n = 2)

因此,这个想法基本上是生成位置为n滞后的第二个矢量,然后减去两个矢量而无需进一步复杂化,从而在R中充分利用矢量化功能。