【问题标题】:Rolling regression with dplyr and lsfit使用 dplyr 和 lsfit 滚动回归
【发布时间】:2016-10-01 07:58:29
【问题描述】:

我正在尝试使用dplyr 运行滚动回归。我正在使用包zoolsfit 中的rollapplyr,因为我只对回归的测试版感兴趣。这是我尝试过的:

library(dplyr); library(zoo)

df1 = expand.grid(site = seq(10),
                    year = 2000:2004,
                    day = 1:50)

df1 %>%
group_by(year) %>%
mutate(beta1 = rollapplyr(data = site,
                            width = 5,
                            FUN = lsfit,
                            x=day))

我收到此错误:Error: not all arguments have the same length

我认为rollapplyr 接受非动物园对象,但我可能错了。也可能是管道 (%>%) 不能很好地与 rollapplyr 配合使用,因为它需要函数中的数据对象。

有什么想法吗?

编辑我的问题不同于:rolling regression with dplyr我想使用管道来使用group_by

【问题讨论】:

    标签: r dplyr regression zoo


    【解决方案1】:

    该函数不会循环遍历多个向量。切片的site 向量与full 向量day 进行比较。我们可以使用Map 编写自己的滚动应用函数来遍历我们的向量组:

    rollapplydf <- function(xx, width) {
      l <- length(xx)
      sq <- Map(':', 1:(l-width+1), width:l)
      lst <- lapply(sq, function(i) lm(xx[i] ~ seq(length(xx[i])))$coeff[2] )
      do.call('rbind', c(rep(NA, width-1L), lst))
    }
    

    所以我们可以将它添加到管道中:

    library(dplyr)
    df1 %>% 
      group_by(year) %>% 
      mutate(beta1 = rollapplydf(xx = site, width = 5) )
    
    # Source: local data frame [2,500 x 4]
    # Groups: year [5]
    # 
    #     site  year   day beta1
    #    (int) (int) (int) (dbl)
    # 1      1  2000     1    NA
    # 2      2  2000     1    NA
    # 3      3  2000     1    NA
    # 4      4  2000     1    NA
    # 5      5  2000     1     1
    # 6      6  2000     1     1
    # 7      7  2000     1     1
    # 8      8  2000     1     1
    # 9      9  2000     1     1
    # 10    10  2000     1     1
    # ..   ...   ...   ...   ...
    

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2018-06-16
      相关资源
      最近更新 更多