Quantmod/R中的滞后函数与下一个函数



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函数中使用它一样?有简单的方法吗?

zoo包中的

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(

相关内容

最新更新