【问题标题】:Rolling lagged differences滚动滞后差异
【发布时间】:2017-08-11 19:21:59
【问题描述】:

好的,所以我希望在 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) 上,并放置前导 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 的差异......

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

所以我想要 NA NA 0.37329

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

【问题讨论】:

  • c(rep(NA, n), diff(vec, lag = n, differences = 1, arithmetic = TRUE, na.pad = TRUE))
  • aha - 我明白了......所以实际上用 c(rep(NA,n)... 引入向量,然后计算差异,以便将它们放置在我想要的位置。很棒

标签: r zoo rollapply


【解决方案1】:

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

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

所以这个想法基本上是生成第二个位置为 n 滞后的向量,并且只需减去这两个向量而无需进一步复杂化,充分利用 R 中的向量化函数。

【讨论】:

    【解决方案2】:

    就像在Zoo lag diff back in data frame中一样

    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)
    require(zoo)
    
    apply(lag(zoo(vec), c(-2,0), na.pad = TRUE), 1L, diff)
    
    #> apply(lag(zoo(vec), c(-2,0), na.pad = TRUE), 1L, diff)
    #       1        2        3        4        5        6        7        8        9       10       11       12       13       14       15 
    #      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 
    

    2018 年 5 月 10 日it was pointed to me by @thistleknot (thanks!) that dplyr masks stats's own lag generic。因此,请确保您没有附加dplyr,或者改为显式运行stats::lag,否则我的代码将无法运行。

    我想我找到了罪魁祸首:github.com/tidyverse/dplyr/issues/1586 答案:这是拥有大量 R 包的自然结果。 只需明确并使用 stats::lag 或 dplyr::lag

    【讨论】:

    • 错误:n 必须是非负整数标量,而不是长度 2 的两倍。真的不确定,但我认为它不接受 c(-2,0)
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2020-10-22
    • 2017-06-14
    相关资源
    最近更新 更多