【问题标题】:Perform multiple rolling regression with different columns (independent variables)使用不同的列(自变量)执行多重滚动回归
【发布时间】:2018-04-30 17:03:52
【问题描述】:

如何在单独的回归中将 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 列的数据集)

以下帖子已接近,但我无法重现编码:

https://stackoverflow.com/questions/39438484/r-how-to-do-rolling-regressions-for-multiple-return-data-at-once-with-the-depe

我该如何调整rollingb来完成工作?

@Yannis Vassiliadis 提供的解决方案有效,但是后续问题提出了如何将所有系数(β)很好地取消列出到矩阵中 /data.frame 有对应的日期(如 xts 中)?

【问题讨论】:

    标签: r regression multiple-columns xts rolling-computation


    【解决方案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 元素是y1yi 上滚动回归的结果。

    另外,您可以添加:

    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
    

    【讨论】:

    • 什么是最好的取消列表方式?我使用 output
    • 您可以使用roll_lm&lt;- plyr::rbind.fill.matrix(rollingb) 之类的东西,rbinds 将所有矩阵组合在一起。您需要小心并跟踪尺寸
    • 我假设你的意思是 names(roll_lm) &lt;- paste0("y1~y",2:6) roll_lm2 &lt;- plyr::rbind.fill.matrix(roll_lm) roll_lm3 &lt;- cbind(roll_lm2, rep(names(roll_lm), each = 281)) # just to keep track of the names 让它工作?
    • @M_Sunny,是的!你说得对,我在传输代码时忘记更新名称了。
    【解决方案2】:

    您可以使用purrr 中的map 按照y1 ~ y2y1 ~ 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)
    

    【讨论】:

    • 有没有办法只提取 data.frame (日期为 xts) 中的系数?
    • coefplot::multiplot(models, plot=FALSE)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2017-01-16
    • 2015-10-01
    • 2020-08-14
    • 2019-07-17
    • 2017-08-29
    • 2016-11-14
    相关资源
    最近更新 更多