使用 dplyr 进行滚动回归

标签 r zoo dplyr

我有一个“日期”、“公司”和“返回”数据框,可通过以下代码重现:

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”拟合“return”并计算线性回归系数并将斜率存储在新列中。如果我想对给定公司内的整个数据集进行拟合,那么我可以简单地调用 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))

最佳答案

## lms is a function which calculate the linear regression coefficient
lms <- function(y, x){
s = which(is.finite(x * y))
y = y[s]
x = x[s]
return(cov(x, y)/var(x))
}

## z is a dataframe which stores our final result
z <- data.frame()

## x has to be ungrouped
x <- ungroup(x)

## subset with "filter" and roll with "rollapply"
symbols <- unique(x$company)
for(i in 1:length(symbols)){
temp <- filter(x, company == symbols[i])
z <- rbind(z, mutate(temp, beta = rollapply(temp[, c(3, 4)], 
                                          FUN = function(x) lms(x[, 1], x[, 2]),
                                          width = 20, fill = NA,
                                          by.column = FALSE, align = "right")))
}

## final result
print(z)

关于使用 dplyr 进行滚动回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770478/

相关文章:

R 包在 AWS t2.micro 卡住上安装 dplyr

r - 在 `arrange` 数据管道函数中将排序方向传递给 `dplyr`

r - 如何保存中间对象?

r - 将每日级别的数据聚合到 R 中的每周级别

r - 通过索引对数据库应用滚动平均值

r - dplyr | group_by 与 anti_join |最有效的方法

html - 使用操作按钮在 R Shiny 中发送电子邮件

r - 如何查找列中的所有组合并计算数据中的出现次数

r - 如何对数据框中的列进行重新排序?

r - 动态合并带后缀的 xts 对象