我有一个“日期”,“公司”和“返回”的数据框,可通过以下代码重现:
library(dplyr)
n.dates <- 60
n.stocks <- 2
date <- seq(as.Date("2011-07-01"), by=1, len=n.dates)
symbol <- replicate(n.stocks, paste0(sample(LETTERS, 5), collapse = ""))
x <- expand.grid(date, symbol)
x$return <- rnorm(n.dates*n.stocks, 0, sd = 0.05)
names(x) <- c("date", "company", "return")
使用此数据框,我可以计算每日市场平均回报,并将该结果添加到新列“market.ret”中 .
x <- group_by(x, date)
x <- mutate(x, market.ret = mean(x$return, na.rm = TRUE))
现在我想将不同公司的所有数据分组(在本例中为2) .
x <- group_by(x, company)
在这样做之后,我想通过“market.ret”拟合“返回”并计算线性回归系数并将斜率存储在新列中 . 如果我想对给定公司内的整个数据集进行拟合,那么我可以简单地调用lm():
group_by(x, company) %>%
do(data.frame(beta = coef(lm(return ~ market.ret,data = .))[2])) %>%
left_join(x,.)
但是,我实际上想要在“滚动”的基础上进行线性回归,即在20天的尾随期间分别进行每一天 . 我想使用rollapply()但不知道如何将两列传递给函数 . 非常感谢任何帮助或建议 .
注意:下面是我用来计算20天回滚标准差的代码,可能会有所帮助:
sdnoNA <- function(x){return(sd(x, na.rm = TRUE))}
x <- mutate(x, sd.20.0.d = rollapply(return, FUN = sdnoNA, width = 20, fill = NA))
2 回答
这是一个
dplyr
解决方案尽管使用了
rollRegres
包,它非常接近the answer here,这与this answer相当接近 .