如何进行多次滚动回归,其中y1为依赖,y2,y3等为独立回归中的独立变量:
见下面的例子:
library(xts)
df=data.frame(y1=rnorm(300),y2=rnorm(300),y3=rnorm(300),y4=rnorm(300),y5=rnorm(300),y6=rnorm(300))
data <- xts(df, Sys.Date()-300:1)
下面我将y1的滚动相关性设置为y2
rollingb <- rollapply(zoo(data),
width=20,
FUN = function(Z)
{
t = lm(formula=y1~ y2, data = as.data.frame(Z), na.rm=T);
return(t$coef)
},
by.column=FALSE, align="right")
结果看起来不错
plot(rollingb)
但是现在我想测试y1~y3,y1~y4等(我有一个总共120列的数据集)
以下帖子已经接近,但我无法重现编码:
如何调整 rollingb 以完成工作?
@Yannis Vassiliadis提供的解决方案有效,但后续问题提出如何将所有系数(beta)很好地转换为矩阵 / data.frame与相应的日期(如在xts中)?
答案 0 :(得分:1)
这个怎么样?
roll_lm <- lapply(2:ncol(data), function(x) rollapply(zoo(data[, c(1, x)]),
width=20,
FUN = function(Z)
{ Z = as.data.frame(Z);
t = lm(formula=Z[, 1]~Z[, 2]);
return(t$coef)
},
by.column=FALSE, align="right"))
输出是一个包含ncol(data) - 1
元素的列表,其中ith
元素是y1
yi
上滚动回归的结果。
另外,您可以添加:
names(roll_lm) <- paste0("y1~y",2:6)
roll_lm2 <- plyr::rbind.fill.matrix(roll_lm)
roll_lm3 <- cbind(roll_lm2, rep(names(roll_lm), each = 281)) # just to keep track of the names
答案 1 :(得分:0)
您可以使用map
中的purrr
来构建y1 ~ y2
和y1 ~ y3
行的公式列表。然后在lm
中使用这些公式中的每一个。
# these are the packages we are using
library(purrr)
library(useful)
library(coefplot)
# here's your data
df=data.frame(y1=rnorm(300),y2=rnorm(300),y3=rnorm(300),y4=rnorm(300),y5=rnorm(300),y6=rnorm(300))
# keep track of the response variable
response <- 'y1'
# we'll assume all the other variables are predictors
predictors <- setdiff(names(df), response)
# fit a bunch of models
models <- predictors %>%
# for each predictor build a formula like y1 ~ y2
map(~build.formula(response, .x)) %>%
# for each of those fit a model
map(lm, data=df)
# plot them for good measure
multiplot(models)