关于在R中滚动回归有很多问题,但在这里我特意寻找使用 dplyr
,_ _1184053_和(如果需要) purrr
的东西 .
这就是使这个问题与众不同的原因 . 我希望与_1844055一致 . 是否可以使用整洁的工具(例如 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
在x
上的滚动回归,超过最后2个观测值 . -
将滚动回归的系数存储在数据帧的列中 .
当然,正如您所看到的,只能计算每组中最后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
EDIT:
这里有一个有趣的后续问题rolling regression with confidence interval (tidyverse)
4 回答
这更像是一个想法而不是答案,但可能不是使用
group_by
尝试使用map
和您的组列表:定义一个函数
Coef
,其参数由cbind(y, x)
形成,并使用截距在x上对y进行回归,返回系数 . 然后使用每组上的当前行和先前行应用rollapplyr
. 如果最后你的意思是当前行的2个先前行,即排除当前行,则将list(-seq(2))
替换为rollapplyr
的参数 .赠送:
变异
以上的变体将是:
仅斜率
如果仅需要斜率,则可以进一步简化 . 我们使用斜率等于
cov(x, y) / var(x)
的事实 .这会做你想要的吗?
赠送:
Edit: 稍微修改过的代码,但是
data_frame
不会接受.
组占位符作为参数 - 不知道如何解决这个问题 .Edit 2: 使用
fill = NA
而不是使用c(NA, ...)
可以获得相同的结果 .这是一个类似于G. Grothendieck's answer但使用
rollRegres
包的解决方案 . 我必须将width
参数增加到3以避免错误(顺便说一句,为什么你想要一个回归,只有很少的观察?)