【问题标题】:Lag Function vs Next Function in Quantmod / RQuantmod / R中的滞后函数与下一个函数
【发布时间】:2021-08-28 21:09:08
【问题描述】:

quantmod 中的 Lag 函数可以接受一个向量,使其“k”个周期滞后(并输出一个矩阵或数组),但我找不到相应的方法来通过一个前瞻性函数来实现这一点——比如 Next()或铅()。

例如,

    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

我试过包含 as.integer(my.k),但得到了同样的错误。我还通过 ?Lag 和 ?Next 查看了帮助说明。

我首先尝试了 dplyr 包中的 lag() 和 lead() 函数——但它们都需要一个“长度为 1 的正整数”来表示“领先或落后的位置数”,并提供以下信息尝试将 my.k 包含在其各自的 n 参数中时出错:

Error: `n` must be a nonnegative integer scalar, not a double vector of length 2.

问题:我如何在某些前瞻性函数中使用 my.k(我创建的向量)——比如 Next() 或 Lead()——就像我在 quantmod Lag 函数中使用它的方式一样?有没有简单的方法可以做到这一点?

【问题讨论】:

  • 感谢两位的回答。我喜欢使用 collapse 包中的 'flag()' 的简单性。从功能开发的角度来看,是否有充分的理由说明“Next()”在矢量化方面与“Lag()”不一致?或者为什么 dplyr 中的“lead()”和“lag()”都不会提供矢量化的灵活性?

标签: r lag next lead


【解决方案1】:

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 有名称,它们不在问题中,这些名称将用于命名输出列。

下面的第二个例子在折叠包中使用了flag

请注意,基 R 的 lag 被定义为使得由正滞后产生的系列更早开始。 lag.zoo 与该约定一致。另一方面,在崩溃中,正滞后意味着系列赛开始较晚。因此,要引用过去的值,该系列将稍后开始,因此使用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)

【讨论】:

    【解决方案2】:

    似乎next() 没有矢量化。这是一个 tidyverse 方法:

    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
    

    reprex package (v2.0.0) 于 2021 年 6 月 12 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多