R:使用每日数据的每月扩展回归

R: monthly expanding regression using daily data

我想使用每日数据以每月频率执行扩展回归。型号是:

ret = \beta_0 + \beta_1 X + \varepsilon

示例数据和我的尝试:

library(zoo)    
df = data.frame(date = seq(as.Date('2011-01-01'),as.Date('2011-03-31'),by = 1), ret = rnorm(90,0,1), X = rnorm(90,0,1))
roll = function(data, n = now(data) {
      rollapplyr(1:n, 1:n, function(x) coef(lm(ret ~ X, data, subset =x))[[2]]
    }
output = df %>%
       mutate(coefficient = roll(data.frame(ret, X)))

上面的代码 运行s 按行扩展回归,我可以只提取每个月的最后一个值以获得该月的系数(即,在这个例子中,我只需要在 1 月估计的系数-31、2 月 28 日和 3 月 31 日)。

但是,我需要将此代码应用于大型数据集,为了节省时间,我只希望在每个月的最后一天以扩展样式回归到 运行(即,不是 运行每天回归)。如果有人可以帮助指出改进代码的方法,我将不胜感激。

创建一个函数 coef2,给定一个 yearmon 对象计算第二个回归系数,直至该年和该月的日期。

library(zoo)

coef2 <- function(ym, data) {
  coef(lm(ret ~ X, data, subset = as.yearmon(date) <= ym))[[2]]
}
yearmonth <- unique(as.yearmon(df$date))
data.frame(yearmonth, slope = sapply(yearmonth, coef2, data = df))
##  yearmonth     slope
## 1 Jan 2011 0.2208940
## 2 Feb 2011 0.1792896
## 3 Mar 2011 0.1180308

如果性能有问题,您可以尝试他的 coef2 替代版本,它避免使用 lm :

coef2 <- function(ym, data) {
  with(subset(data, as.yearmon(date) <= ym), cov(ret, X) / var(X))
}