R 面板数据滚动多元回归

R 面板数据滚动多元回归,r,linear-regression,rolling-computation,R,Linear Regression,Rolling Computation,我试图对按股票分组的数据集进行滚动多元回归。下面可以看到数据集的一个示例。它从1991年到2019年,包含关于股票的信息,如回报率等。我打算使用36个月的滚动回归窗口,对每只股票的EPU_纸上的依赖变量ExcessReturn进行回归。我还希望这些股票在36个月的滚动窗口中至少有18个月的回报观察。ISIN是本例中每个股票的标识符。我还想在回归中包括规模、投资、BM和OP作为控制。数据集不包含任何NAs,但beta_monthly列除外,该列均为NAs 这是我试图运行的代码。我能够使for循环工

我试图对按股票分组的数据集进行滚动多元回归。下面可以看到数据集的一个示例。它从1991年到2019年,包含关于股票的信息,如回报率等。我打算使用36个月的滚动回归窗口,对每只股票的EPU_纸上的依赖变量ExcessReturn进行回归。我还希望这些股票在36个月的滚动窗口中至少有18个月的回报观察。ISIN是本例中每个股票的标识符。我还想在回归中包括规模、投资、BM和OP作为控制。数据集不包含任何NAs,但beta_monthly列除外,该列均为NAs

这是我试图运行的代码。我能够使for循环工作,但没有得到期望的结果。最佳情况下,我希望将EPU_纸张的系数添加到df_Final的正确行中

我对全新的解决方案和当前尝试的变体持开放态度

# Create date sequence
date <- seq(as.Date("1991-01-01"),as.Date("2019-12-31"), by = "month")

## Model
v <- 36 # No. of observations in rolling regression 
w <- 18 # observations of stocks requred in period 

df_Final$beta_monthly <- NA

for (i in 1:(length(date)-v)) {
  beta.tab <- df_Final %>% filter(Date >= date[i] & Date < date[i+v]) %>%
    group_by(ISIN) %>% filter(n() >= w) %>%
    do(ols.model = lm(formula = ExcessReturn ~ EPU_Paper + SIZE, .)) %>%
    mutate(beta_monthly = coefficients(ols.model)[2],
           Date = date[v+1])
  } 


您可以尝试“拆分-应用-合并”方法

.date <- sort(unique(df2$date))
i <- 1; v <- 24; w <- 3

res <- do.call(rbind, lapply(1:v, function(i) {
  ds <- df2$date %in% .date[0:(v - 1) + i]
  S <- split(df2[ds, ], df2[ds, "date"])
  dat <- do.call(rbind, unname(S[sapply(S, nrow) >= w]))
  fit <- lm(y ~ x1 + x2, dat)
  rs <- dat$date %in% .date[i]
  beta_monthly <- unname(fit$coef[2])
  if (any(rs)) cbind(dat[rs, ], beta_monthly) else NULL
}))

head(res, 10)
#    cl       date          y        x1          x2 beta_monthly
# 6   A 2011-02-01  0.1947135  38.20878 62846231450  -0.01949786
# 7   B 2011-02-01  5.7908162 130.09371 73446134000  -0.01949786
# 8   C 2011-02-01 -1.6335241  63.67381 93917412861  -0.01949786
# 9   D 2011-02-01 -4.8414052 151.70718 76852791458  -0.01949786
# 10  E 2011-02-01  4.1640901 123.10342 16714132588  -0.01949786
# 11  A 2011-03-01 -2.0569659 104.46436 28101485893  -0.01935559
# 12  B 2011-03-01  9.2205063  24.58415 42584043997  -0.01935559
# 13  C 2011-03-01 -0.1572310  65.94721 83745620495  -0.01935559
# 14  D 2011-03-01  5.2782394  25.69336 15235322119  -0.01935559
# 15  E 2011-03-01  3.6096263 163.65887 66618792459  -0.01935559

.date看起来你以前问过这个问题:正确,但我想对这个问题再详细说明一下,因此我发现我可以再发布一次,而不是编辑上一个问题
.date <- sort(unique(df2$date))
i <- 1; v <- 24; w <- 3

res <- do.call(rbind, lapply(1:v, function(i) {
  ds <- df2$date %in% .date[0:(v - 1) + i]
  S <- split(df2[ds, ], df2[ds, "date"])
  dat <- do.call(rbind, unname(S[sapply(S, nrow) >= w]))
  fit <- lm(y ~ x1 + x2, dat)
  rs <- dat$date %in% .date[i]
  beta_monthly <- unname(fit$coef[2])
  if (any(rs)) cbind(dat[rs, ], beta_monthly) else NULL
}))

head(res, 10)
#    cl       date          y        x1          x2 beta_monthly
# 6   A 2011-02-01  0.1947135  38.20878 62846231450  -0.01949786
# 7   B 2011-02-01  5.7908162 130.09371 73446134000  -0.01949786
# 8   C 2011-02-01 -1.6335241  63.67381 93917412861  -0.01949786
# 9   D 2011-02-01 -4.8414052 151.70718 76852791458  -0.01949786
# 10  E 2011-02-01  4.1640901 123.10342 16714132588  -0.01949786
# 11  A 2011-03-01 -2.0569659 104.46436 28101485893  -0.01935559
# 12  B 2011-03-01  9.2205063  24.58415 42584043997  -0.01935559
# 13  C 2011-03-01 -0.1572310  65.94721 83745620495  -0.01935559
# 14  D 2011-03-01  5.2782394  25.69336 15235322119  -0.01935559
# 15  E 2011-03-01  3.6096263 163.65887 66618792459  -0.01935559
set.seed(42)
df2 <- expand.grid(cl=LETTERS[1:5],
                   date=seq(as.Date("2011-01-01"), as.Date("2019-12-31"), by="month"))
df2 <- df2[-sample(1:nrow(df2), nrow(df2)*.1), ]
n <- nrow(df2)
df2 <- transform(df2,
                 y=rnorm(n, 2, 5),
                 x1=runif(n, 20, 180),
                 x2=runif(n, 1e8, 1e11))