R 按组滚动回归

问题描述

我想为每个公司做一个滚动回归窗口。由于我每年(从 2003 年开始)和每家公司都需要系数,因此我从 1998 年到 2018 年增加了数据框的年数。该窗口应为 5Years、1998-2002、1999-2003、2000-2004 等。我想将回归系数添加为新列。 我的方法基于这里的解决方Rolling Regression by Group

我编辑了一些数据。我的真实数据大约有 3,000 个观察值。

n_firms <- 30 
dt <- rep(1:n_firms,each = 21)
dt <- data.frame(firm = dt)
a <-c(1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018)
dt$time <- rep(a,n_firms)
dt <- dt %>% group_by(firm) %>% mutate(y=rnorm(21,10,5))
dt <- dt %>% group_by(firm) %>% mutate(x=rnorm(21,5,2))
dt <- as.data.table(dt)

我正在尝试以下代码

library(rollRegres)
library(data.table)
library(dplyr)

    dt[,coefsreg :=
        roll_regres.fit(x = cbind(1,.SD[["x"]]),y = .SD[["y"]],width = 5L)$coefs[,2],by = firm]

我收到这个警告():

1: 在 evalq((function (...,call. = TRUE,immediate. = FALSE,... :
相对于参数数量而言,样本量较小

警告重要吗?我的方法错了吗?另外是否也可以将残差作为与系数相同的列添加

谢谢。我是 R 的新手。 我的英文不是很好。我希望你能理解我的问题。

解决方法

警告来自以下事实:对于某些窗口,您没有足够的观察值来估计。例如,没有对 1998 年到 2001 年的估计值,因为这些观测值的数量将小于您的窗口宽度。

创建一个单独的函数,该函数返回 coef、pred、resid 或您想要的任何其他内容,并在列表中返回这些向量。然后在j中调用这个函数,byfirm,用你的原始数据cbind。

window_regre <- function(x,y,width=5L) {
  coefs = roll_regres.fit(x = cbind(1,x),y=y,width=width)$coefs
  pred = coefs[,2]*x + coefs[,1]
  resid = y-pred
  return(list("coef" = coefs[,2],"pred" = pred,"resid" = resid))
}
  
cbind(dt,dt[,window_regre(x,y),by=firm][,-"firm"])