【发布时间】:2020-10-08 15:20:03
【问题描述】:
我有每个组的月度数据,我想对每个组做回归,窗口是 2 年并得到斜率。
我尝试了几种方法
- 我尝试使用 for 循环,每次过滤 2 年的数据,然后执行 lm
df$Year =year(df$date) df1<-purrr::map_df(min(df$Year):(max(df$Year) - 2), function(i) { df %>% filter(Year%in% c(i,i+1)) %>% group_by(group)%>% do(lm = lm(R ~ M, data = .,na.action=na.exclude)) %>% mutate(lm_b0 = summary(lm)$coeff[1], lm_b1 = summary(lm)$coeff[2])%>% ungroup() })
得到错误:
lm.fit 中的错误(x,y,偏移量 = 偏移量,奇异值.ok = 奇异值.ok,...) : 0 (non-NA) 案例
- 然后我试图定义一个函数斜率,但结果df1,列“斜率”都是NA
slope <- . %>% { cov(.[, 2], .[, 1]) / var(.[, 2])} df1<-df %>% group_by(group,Year) %>% mutate(slope = rollapplyr(cbind(R, M), 2, slope, by.column = FALSE, fill = NA)) %>%ungroup()
- 我找到了 roll_lm 方法:
library(roll) df1<-df%>% group_by(group,Year)%>% roll_lm(MKT,RET,2)
得到错误:
roll_lm(., M, R, 5) 中的错误:找不到对象“M”
4.我试过这个,但结果都是NA
df1<-df%>%
group_by(group,Year)%>%
do(data.frame(., rolling_coef = rollapplyr(data = ., width = 2, FUN = function(df_) {
mod = lm(R ~ M, data = .)
return(coef(mod)[2])
}, by.column = FALSE, fill = NA)))
我也试过直接使用beta,它可以工作,但似乎beta是非负数值变量,我的M和R有负值。
有人能给我一些想法吗?谢谢!
【问题讨论】:
-
请提供一个代表
-
对不起。我以前没有使用过reprex。而且总是出错。我在 github 中做了一个示例代码和数据文件。 github.com/lingqi-w/testing.git
-
@ling 他们的意思是一个最小的可重现示例,请参阅:stackoverflow.com/a/5963610/6574038
-
set.seed(1) Data <- data.frame( group = sample(letters[1:4], 500, replace = TRUE), date= sample(seq(as.Date('2000/01/01'), as.Date('2003/01/01'),by="m"), 500, replace = TRUE), R=sample(runif(20),500,replace = TRUE), M=sample(runif(10),500,replace = TRUE) )谢谢@jay.sf 真的很有帮助。我创建了一个示例数据集。
标签: r