关于在R中进行滚动回归的问题有很多,但我这里特别要求使用dplyr
,broom
和(如有必要)purrr
来完成。这就是让这个问题与众不同的地方。我想要保持tidyverse
的一致性。是否可能使用诸如purrr:map
和dplyr
等整洁工具进行恰当的滚动回归呢?
请考虑这个简单的例子:
library(dplyr)
library(purrr)
library(broom)
library(zoo)
library(lubridate)
mydata = data_frame('group' = c('a','a', 'a','a','b', 'b', 'b', 'b'),
'y' = c(1,2,3,4,2,3,4,5),
'x' = c(2,4,6,8,6,9,12,15),
'date' = c(ymd('2016-06-01', '2016-06-02', '2016-06-03', '2016-06-04',
'2016-06-03', '2016-06-04', '2016-06-05','2016-06-06')))
group y x date
<chr> <dbl> <dbl> <date>
1 a 1.00 2.00 2016-06-01
2 a 2.00 4.00 2016-06-02
3 a 3.00 6.00 2016-06-03
4 a 4.00 8.00 2016-06-04
5 b 2.00 6.00 2016-06-03
6 b 3.00 9.00 2016-06-04
7 b 4.00 12.0 2016-06-05
8 b 5.00 15.0 2016-06-06
对于每个组(在本例中,a
或b
):
- 计算
y
在过去2个观测期内对x
的滚动回归。 - 将该滚动回归的系数存储在数据框的一列中。
当然,正如您所看到的,滚动回归只能针对每组中的最后2行进行计算。
我已经尝试使用以下方法,但没有成功。
data %>% group_by(group) %>%
mutate(rolling_coef = do(tidy(rollapply(. ,
width=2,
FUN = function(df) {t = lm(formula=y ~ x,
data = as.data.frame(df),
na.rm=TRUE);
return(t$coef) },
by.column=FALSE, align="right"))))
Error in mutate_impl(.data, dots) :
Evaluation error: subscript out of bounds.
In addition: There were 21 warnings (use warnings() to see them)
有任何想法吗?
第一个a
组的最后两行期望输出为0.5和0.5(在这个例子中,y
和x
之间确实存在完美的线性相关性)
更具体地说:
mydata_1 <- mydata %>% filter(group == 'a',
row_number() %in% c(1,2))
# A tibble: 2 x 3
group y x
<chr> <dbl> <dbl>
1 a 1.00 2.00
2 a 2.00 4.00
> tidy(lm(y ~ x, mydata_1))['estimate'][2,]
[1] 0.5
而且
mydata_2 <- mydata %>% filter(group == 'a',
row_number() %in% c(2,3))
# A tibble: 2 x 3
group y x
<chr> <dbl> <dbl>
1 a 2.00 4.00
2 a 3.00 6.00
> tidy(lm(y ~ x, mydata_2))['estimate'][2,]
[1] 0.5
编辑:
对于这个问题的有趣后续,请参见此处 (tidyverse)滚动回归置信区间
purrr
、tidyverse解决方案,这在你提供的链接中并不可用。 - ℕʘʘḆḽḘ