微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决R:使用每日数据的月度扩展回归

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

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,1),X = rnorm(90,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)))

上面的代码逐行运行扩展回归,我可以只提取每个月的最后一个值以获得该月的系数(即,在本例中,我只需要估计在 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))
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。