多次滚动回归(Fama-Macbeth过程)

问题描述 投票:0回答:1

问题简介

大家好,

我目前正在使用著名的Fama-Macbeth滚动窗口过程来完成我的论文,以估计具有许多自变量且面板数据不平衡的模型。将与不同的多因素模型进行比较。这里我要求完整的代码(8个因素),因为完整的代码将用作较小模型的参考。

问题在这里出现,因为网络上的许多教程都涉及滚动回归,但很少有以多元回归的方式展示它的。我的编码知识目前不足以在没有足够参考以前的示例的情况下提出这样的问题。此外,如果有人对Python有更好的了解,我也将非常感谢此代码的Python版本。

我研究了许多类似的问题,但除了一个,我找不到适合我的数据的东西。似乎最快的方法之一是使用矩阵代数或“ rollRegres”。好吧,“ rollRegres”版本可以正常工作,直到我的数据显示缺失值(空白单元格)自动转换为“ NA”为止。但是,这些丢失的数据按不同的证券显示不同的发行日期,这意味着对于这些丢失的单元格将不采取任何措施。

因此,如果有人知道如何加快此代码的速度(在较大的数据集的情况下效率不高),提出其他建议或正确地向我展示如何以矩阵形式进行操作,我将不胜感激。

摘要:

  • 滚动回归(8天+ 1300 dep。var,窗口为60天)-需要测试版
    • 大数据集“ Y”(每个具有1.000个条目的1,300 dep。var)
    • 数据集“ X”(8个ind。var's-factor-全部带有1000个条目)
  • 任何使它健壮的可能性(用成功的库MASS的rlm()替换lm())
  • 由于发布日期不同(数据特殊),数据集“ Y”中的NA)
  • 效率(速度问题)
  • 输出(导出问题)

代码

我的数据集的合理复制如下。请记住,原始数据集要大得多,而这样的代码将远远不够高效。

###LIBRARIES
library(zoo)


###DATASET

set.seed(10000000)

df <- data.frame(

##Date
Date = seq(as.Date("2000/01/01"), by = "day", length.out = 5000),  

##Factors (indep var)
MKTRF = sample(1:100, 5000, replace=TRUE),
SMB = sample(1:100, 5000, replace=TRUE),
HML = sample(1:100, 5000, replace=TRUE),
RMW = sample(1:100, 5000, replace=TRUE),
CMA = sample(1:100, 5000, replace=TRUE),
MOM = sample(1:100, 5000, replace=TRUE),
TERM = sample(1:100, 5000, replace=TRUE),
DEF = sample(1:100, 5000, replace=TRUE),

##Securities (dep var)
#type 0
B1 = c(rep(NA, 1000), sample(1:100, 3000, replace=TRUE), rep(NA, 1000)),
B2 = c(rep(NA, 1500), sample(1:100, 3000, replace=TRUE), rep(NA, 500)),
B3 = c(sample(1:100, 3000, replace=TRUE), rep(NA, 2000)),
B4 = c(rep(NA, 1000), sample(1:100, 4000, replace=TRUE)),
B5 = c(sample(1:100, 5000, replace=TRUE)),

#type 1
GB1 = c(rep(NA, 1500), sample(1:100, 2000, replace=TRUE), rep(NA, 1500)),
GB2 = c(rep(NA, 1500), sample(1:100, 3000, replace=TRUE), rep(NA, 500)),
GB3 = c(sample(1:100, 3000, replace=TRUE), rep(NA, 2000)),
GB4 = c(rep(NA, 1000), sample(1:100, 4000, replace=TRUE)),
GB5 = c(sample(1:100, 5000, replace=TRUE)))


###REGRESSION

#Setting the problem
z <- read.zoo(df, FUN = as.yearmon, format = "%Y/%m/%d")
View(z)

getCoef <- function(z, lhs, rhs) {
  if (all(is.na(z[, lhs]))) "Empty"         #"Empty" is for me to spot empty cells due to different issue dates
  else coef(lm(paste(lhs, "~", rhs), z))
}

roll <- function(z, lhs, rhs = "MKTRF + SMB + HML + RMW + CMA + MOM + TERM + DEF") {
  rollapplyr(z, 60, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs)
}

ynames <- c("B1", "B2", "B3", "B4", "B5", "GB1", "GB2", "GB3", "GB4", "GB5")

#Regress
L <- lapply(ynames, roll, z = z)

#Save outputs
output <- Map(fortify.zoo, L)


此代码来自Stack-Overflow上的类似问题,虽然有效,但在输出中显示了一个小问题(在屏幕截图中将变得很清楚-数据的第一行呈金字塔形结果)。而且,它对于长数据集绝对无效。最后,我想以简洁明了的方式导出每种安全性的所有beta(在本例中为B1:GB5);现在这些保留在“输出”列表中;最好在桌子上打开并带有注释。

[如果有人愿意提出任何类型的改进,那么,将不胜感激。而且,我认为这对于处理此类回归问题的其他人可能仍然是可靠的参考。

Image - Pyramidal_outputs

祝您生活愉快,并提前感谢!

r linear-regression na rolling-computation
1个回答
0
投票
删除开头的NA

使用矩阵X和Y

    对于每个子集,我们可以一次回归所有的Y列,从而将lm调用的数量减少一个数量级
  • 在索引上而不是数据上滚动
  • 更新一次lm对象,而不是每次都创建一个新对象
  • 这将导致以下代码。
  • library(zoo) df2 <- na.omit(df) nr <- nrow(df2) X <- as.matrix(df2[2:9]) Y <- as.matrix(df2[10:19]) fm <- lm(Y ~ X) coefFun <- function(ix) coef(update(fm, subset = ix)) rollapplyr(1:nr, 60, coefFun, fill = NA)
  • © www.soinside.com 2019 - 2024. All rights reserved.