【发布时间】:2021-04-01 20:13:45
【问题描述】:
我想使用dplyr、do() 和rollapply() 进行滚动逐步回归。我的数据代码如下所示:
FUND_DATA <- tibble(
DATE = 1:10,
FUND1 = rnorm(10),
FUND2 = rnorm(10),
FUND3 = rnorm(10),
FUND4 = rnorm(10))
这些只是 1-10 期基金的相同价格。对于独立变量,它看起来是一样的:
FACTORS <- tibble(
DATE = 1:10,
x1 = rnorm(10),
x2 = rnorm(10),
x3 = rnorm(10),
x4 = rnorm(10))
现在我将上面的两个小标题合并如下:
REG_DATA <- FUND_DATA %>%
pivot_longer(contains("FUND"), names_to = "FUND",
values_to = "PRICE") %>% arrange(FUND,DATE) %>% left_join(., FACTORS, by = "DATE") %>%
group_by(FUND) %>% mutate(RET = PRICE/lag(PRICE)-1) %>% drop_na()
所以我有一些长标题并按基金分组。
A tibble: 36 x 8
# Groups: FUND [4]
DATE FUND PRICE x1 x2 x3 x4 RET
<int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 FUND1 -1.19 -0.422 -0.872 -0.292 -0.176 -2.04
2 3 FUND1 -0.869 1.60 0.247 -0.610 0.170 -0.272
3 4 FUND1 -1.60 0.159 -0.757 0.730 -0.154 0.839
4 5 FUND1 -1.58 -0.688 -0.718 0.778 0.879 -0.0103
5 6 FUND1 1.14 -0.00190 -0.956 1.14 -0.953 -1.72
6 7 FUND1 -0.452 0.730 -0.344 0.925 -0.593 -1.40
7 8 FUND1 -0.809 0.895 -0.987 -0.0791 -0.0133 0.792
8 9 FUND1 1.06 -0.503 1.06 1.96 0.362 -2.31
9 10 FUND1 0.0358 0.359 -0.370 1.27 0.129 -0.966
10 2 FUND2 -0.525 -0.422 -0.872 -0.292 -0.176 -0.229
# ... with 26 more rows
在此数据上,我想为每个基金执行滚动逐步回归,并为每个滚动窗口和基金存储 R^2。因此,对于每个窗口,应该执行逐步回归。我想出了以下代码:
ROLLING <- REG_DATA %>% group_by(FUND) %>% do(R2 = rollapply(., width = 2, function(x){
summary(step(lm(RET ~ x1+x2+x3+x4,
data = .), direction = "both", trace = 0))$r.squared
},by.column = FALSE,align = "right"))
代码运行没有错误,但输出是问题所在。这段代码只存储了最后一个滚动窗口(周期 8-10)的 R^2 并覆盖了我认为的其他代码,所以它看起来像这样:
FUND1 c(0.675, 0.675, 0.675,...)
FUND2 c(0.447, 0.447, 0.447,...)
FUND3 .....
你们能帮我让代码为每个窗口存储 R^2 吗?
【问题讨论】:
-
我认为问题不在于它被覆盖了,我认为问题在于您通过
data = .而不是data=x将完整的数据集传递给模型。我试图修复它,但用后者替换前者不起作用。
标签: r dplyr regression rollapply