使用 dplyr 和 lsfit 进行滚动回归
Rolling regression with dplyr and lsfit
我正在尝试 运行 使用 dplyr
进行滚动回归。我正在使用包 zoo
和 lsfit
中的 rollapplyr
,因为我只对回归的 beta 感兴趣。这是我尝试过的:
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
该函数不会循环遍历多个向量。切片 site
向量与 完整 向量 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
# .. ... ... ... ...
我正在尝试 运行 使用 dplyr
进行滚动回归。我正在使用包 zoo
和 lsfit
中的 rollapplyr
,因为我只对回归的 beta 感兴趣。这是我尝试过的:
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
该函数不会循环遍历多个向量。切片 site
向量与 完整 向量 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
# .. ... ... ... ...