【发布时间】:2017-08-20 15:57:09
【问题描述】:
我发现了有关此主题的一些先前问题,尤其是 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)
我想对“fund”列指示的每个组的两列 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
【问题讨论】:
标签: r linear-regression rollapply