Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用dplyr进行滚动回归_R_Zoo_Dplyr - Fatal编程技术网

用dplyr进行滚动回归

用dplyr进行滚动回归,r,zoo,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)

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

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")
然而,我实际上希望在“滚动”的基础上进行线性回归,即在20天的跟踪期内,每天单独进行线性回归。我想使用rollappy(),但不知道如何将两列传递到函数中。非常感谢您的任何帮助或建议

注:以下是我用于计算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))
sdnoNA是一个计算线性回归系数的函数
lms这是一个
dplyr
解决方案

#####
#将数据设置为OP(计算市场回报时注意修复)
图书馆(dplyr)
种子集(41797642)

n、 日期请参见
?滚动应用
,并注意该页面上的滚动回归示例。
RcppRoll
是另一个值得查看的示例。@G.Grothendieck感谢您的提醒!经过一点修改后,代码确实有效。我将把我目前的方法用于回答任何感兴趣的人。@TommyO'Dell感谢您的建议,但rollapply已经完成了这项工作。
x <- group_by(x, company)
group_by(x, company) %>%
do(data.frame(beta = coef(lm(return ~ market.ret,data = .))[2])) %>%
left_join(x,.)
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)