quantmod中的Lag函数可以接受其";k〃;周期滞后(并输出矩阵或数组(,但我找不到通过前瞻性函数(如Next((或lead(((来实现这一点的相应方法。
例如,
variable <- runif(5,1,30)
my.k <- c(2, 3)
Lag(variable, my.k)
returns:
Lag.2 Lag.3
[1,] NA NA
[2,] NA NA
[3,] 18.71971 NA
[4,] 10.98429 18.71971
[5,] 17.19299 10.98429
然而,quantmod的Lag命令的倒数,即Next((命令,返回以下内容:
> variable <- runif(5,1,30)
> my.k <- c(2, 3)
> Next(variable, my.k)
Error in Next.numeric(variable, my.k) : k must be a non-negative integer
我尝试过将其包含为.integer(my.k(,但得到了相同的错误。我还通过这两种方式查看了帮助说明?滞后和?下一个
我开始尝试dplyr包中的lag((和lead((函数,但它们都需要一个";长度为1的正整数";对于";领先或滞后";,并在尝试将my.k包括在它们各自的n的自变量中时提供以下错误:
Error: `n` must be a nonnegative integer scalar, not a double vector of length 2.
问:我如何在一些前瞻性函数中使用我的.k(我创建的向量(,比如Next((或lead((,就像我在quantmod Lag函数中使用它一样?有简单的方法吗?
lag.zoo
和collapse包中的flag
都支持前向和后向矢量化滞后。任何一个都可以在一行代码中创建所有my.k
滞后,而无需迭代。
下面的第一个示例将variable
转换为zoo类,然后使用lag.zoo
执行滞后。zoo对象通常不需要填充,但如果这是为了在无法处理的数据帧中使用,我们将添加na.pad = TRUE
。然后可以选择使用coredata
将其转换回纯数字。注意,dplyr阻塞R中的通用lag
函数,因此不加载dplyr,使用library(dplyr, exclude = c("lag", "filter"))
加载它,或者使用stats::lag
强制使用基本R中的lag
通用,后者将依次调度lag.zoo
。如果my.k
有名称,它们不在问题中,那么这些名称将用于命名输出列。
下面的第二个示例在collapse包中使用flag
。
注意,基R的lag
被定义为使得由正滞后产生的序列更早开始。CCD_ 16符合该约定。另一方面,在崩溃中,正滞后意味着系列赛开始得晚。因此,为了参考过去的值,序列开始得较晚,因此对lag.zoo
使用负滞后,对flag
使用正滞后要从未来向后拉值,在这两种情况下都使用这些滞后的负数
问题中的代码是不可复制的,因为它使用随机数而没有设置种子,所以我们按照末尾的注释中所示设置种子以生成示例输入。
lag.zoo
library(zoo)
coredata(stats::lag(as.zoo(variable), -my.k, na.pad = TRUE))
## lag-2 lag-3
## [1,] NA NA
## [2,] NA NA
## [3,] 9.339748 NA
## [4,] 23.860849 9.339748
## [5,] 12.860331 23.860849
coredata(stats::lag(as.zoo(variable), my.k, na.pad = TRUE))
## lag2 lag3
## [1,] 12.86033 26.60750
## [2,] 26.60750 28.27355
## [3,] 28.27355 NA
## [4,] NA NA
## [5,] NA NA
旗帜
library(collapse)
flag(variable, my.k)
## L2 L3
## [1,] NA NA
## [2,] NA NA
## [3,] 9.339748 NA
## [4,] 23.860849 9.339748
## [5,] 12.860331 23.860849
## attr(,"class")
## [1] "matrix"
flag(variable, -my.k)
## F2 F3
## [1,] 12.86033 26.60750
## [2,] 26.60750 28.27355
## [3,] 28.27355 NA
## [4,] NA NA
## [5,] NA NA
## attr(,"class")
## [1] "matrix"
备注
可复制形式的输入(使用set.seed
(:
set.seed(123)
variable <- runif(5,1,30); variable
## [1] 9.339748 23.860849 12.860331 26.607505 28.273551
my.k <- c(2, 3)
似乎next()
没有矢量化。这里有一个不同的方法:
library(tidyverse)
set.seed(123)
variable <- tibble(values = runif(5,1,30))
my.k <- c(2, 3)
variable
#> # A tibble: 5 x 1
#> values
#> <dbl>
#> 1 9.34
#> 2 23.9
#> 3 12.9
#> 4 26.6
#> 5 28.3
#tidyverse easy way
mutate(variable, lead_1 = lead(values, 2),
lead_2 = lead(values, 3))
#> # A tibble: 5 x 3
#> values lead_1 lead_2
#> <dbl> <dbl> <dbl>
#> 1 9.34 12.9 26.6
#> 2 23.9 26.6 28.3
#> 3 12.9 28.3 NA
#> 4 26.6 NA NA
#> 5 28.3 NA NA
#tidyverse when my.k is big
my.k %>% map(~ transmute(variable, lead = dplyr::lead(values, .x))) %>%
map2_dfc(my.k, ~set_names(.x, paste0('lead_', as.character(.y))))
#> # A tibble: 5 x 2
#> lead_2 lead_3
#> <dbl> <dbl>
#> 1 12.9 26.6
#> 2 26.6 28.3
#> 3 28.3 NA
#> 4 NA NA
#> 5 NA NA
创建于2021-06-12由reprex包(v2.0.0(