滚动滞后差异
Rolling lagged differences
好的,所以我希望在 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 差...
我们取第 3 个元素...44.17308
- 43.79979
= 0.37329
的结果。
所以我想要NA NA 0.37329
而不是将 0.37329
放在新的 lag2 向量的第一个位置。
就像 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
,否则我的代码不会 运行.
I think I found the culprit: github.com/tidyverse/dplyr/issues/1586
answer: This is a natural consequence of having lots of R packages.
Just be explicit and use stats::lag or dplyr::lag
对于那些寻找 tidyverse
解决方案的人来说,一种选择是使用 dplyr::lag
,我发现它比 base::apply
.
更直观
vec - dplyr::lag(vec, n = 2)
因此,我们的想法基本上是生成第二个位置为 n 滞后的向量,只需将两个向量相减即可,无需进一步复杂化,充分利用 R 中的向量化函数。
好的,所以我希望在 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 差...
我们取第 3 个元素...44.17308
- 43.79979
= 0.37329
的结果。
所以我想要NA NA 0.37329
而不是将 0.37329
放在新的 lag2 向量的第一个位置。
就像 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
,否则我的代码不会 运行.
I think I found the culprit: github.com/tidyverse/dplyr/issues/1586 answer: This is a natural consequence of having lots of R packages. Just be explicit and use stats::lag or dplyr::lag
对于那些寻找 tidyverse
解决方案的人来说,一种选择是使用 dplyr::lag
,我发现它比 base::apply
.
vec - dplyr::lag(vec, n = 2)
因此,我们的想法基本上是生成第二个位置为 n 滞后的向量,只需将两个向量相减即可,无需进一步复杂化,充分利用 R 中的向量化函数。