我发现了一些关于这个主题的先前问题,尤其是R: Grouped rolling window linear regression with rollapply and ddply和R: Rolling / moving avg by group,但是,这两个问题都没有为我所面临的问题提供精确的解决方案 . 我目前正在尝试使用线性回归估计CAPM beta而不是面板数据 . 所以我有不同的资金(在下面的例子中我使用了3个基金组),我想分别和每行计算beta . 为了使这更抽象:我试图用一个移动的窗口按组进行线性回归,以根据窗口中的数据估算每一行的系数 .
install.packages("zoo","dplyr")
library(zoo);library(dplyr)
# Create dataframe
fund <- as.numeric(c(1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,2,2,2,2,2,2))
return<- as.numeric(c(1:21))
benchmark <- as.numeric(c(1,13,14,20,14,32,4,1,5,7,1,0,7,1,-2,1,6,-7,9,10,9))
riskfree<-as.numeric(c(1,5,1,2,1,6,4,7,5,-5,10,0,3,1,2,1,6,7,8,9,10))
date <- as.Date(c("2010-07-30","2010-08-31","2010-09-30","2010-10-31","2010-11-30","2010-12-31","2011-01-30",
"2011-02-28","2010-07-31","2010-09-30","2010-10-31","2010-11-30","2010-12-31","2011-01-30",
"2010-07-30","2010-08-31","2010-09-30","2010-10-31","2010-11-30","2010-12-31","2011-01-30"))
funddata<-data.frame(date,fund,return,benchmark,riskfree)
# Creating variables of interest
funddata["ret_riskfree"]<-as.numeric(funddata$return-funddata$riskfree)
funddata["benchmark_riskfree"]<-as.numeric(funddata$benchmark-funddata$riskfree)
对于“基金”一栏所指示的每个组,我想对两列df [6:7]进行滚动回归 . 计算应该单独进行,因此每个基金组的beta列中的前两行将始终显示“NA” . 最后,我希望得到一个包含所有基金组和所有beta值的完整数据框 . 我设法提出了一个新的代码,但它非常混乱,它需要在执行之前按基金和日期订购数据 . 我欢迎任何有关如何使其变得更好的建议 .
funddata <- funddata[order(funddata$fund, funddata$date),]
beta_func <- function(x, benchmark_riskfree, ret_riskfree) {
a <- coef(lm(as.formula(paste(ret_riskfree, "~", benchmark_riskfree,-1)),
data = x))
return(a)
}
beta_list<-list()
for (i in c(1:3)){beta_list[[paste(i, sep="_")]]<- (rollapplyr(funddata[(funddata$fund==i),6:7], width = 3,
FUN = function(x) beta_func(as.data.frame(x), "benchmark_riskfree" , "ret_riskfree"),
by.column = FALSE,fill=NA))}
beta_list<-unlist(beta_list, recursive=FALSE)
funddata$beta<-beta_list
1 回答
正如我在上面的评论中提到的,这个解决方案可能有点偏,因为我无法100%重现您想要的输出 . 尽管如此,你想要完成的功能仍然存在 . 看看它,让我知道这是你可以使用的东西,还是我可以进一步发展 .
EDIT: 下面的代码没有重现上面指定的所需输出,但结果却是OP正在寻找的东西 .
开始: