【问题标题】:"Rolling" Regression in RR中的“滚动”回归
【发布时间】:2019-09-25 01:39:22
【问题描述】:

假设我想对每个组进行回归,我想使用最近 5 年的数据作为回归的输入。然后,对于接下来的每一年,我想将该回归的输入“移动”一年(即 4 个观察值)。

我想从这些回归中提取 R2 和拟合值/残差,然后在遵循类似概念的后续回归中需要它们。

我有一些使用循环的代码,但对于大型数据集来说,它不是很优雅也不是很有效。我认为必须有一个很好的方法来解决这个问题。

# libraries #
library(dplyr)
library(broom)

# reproducible data #    
df <- tibble(ID = as.factor(rep(c(1, 2), each = 40)),
             YEAR = rep(rep(c(2001:2010), each = 4), 2),
             QTR = rep(c(1:4), 20),
             DV = rnorm(80),
             IV = DV * rnorm(80))

# output vector #
output = tibble(ID = NA,
                YEAR = NA,
                R2 = NA)

# loop #
k = 1

for (i in levels(df$ID)){

  n_row = df %>% 
    arrange(ID) %>% 
    filter(ID == i) %>% 
    nrow()

  for (j in seq(1, (n_row - 19), by = 4)){

    output[k, 1] = i
    output[k, 2] = df %>% 
      filter(ID == i) %>%  
      slice((j + 19)) %>% 
      select(YEAR) %>% 
      unlist()

    output[k, 3] = df %>% 
      filter(ID == i) %>%  
      slice(j:(j + 19)) %>% 
      do(model = lm(DV ~ IV, data = .)) %>% 
      glance(model) %>% 
      ungroup() %>% 
      select(r.squared) %>% 
      ungroup()

    k = k + 1
  }
}

【问题讨论】:

    标签: r regression rolling-computation


    【解决方案1】:

    定义一个函数,在给定df(不带ID)的行子集的情况下返回年份和R 的平方,然后将rollapply 与它一起使用。

    library(dplyr)
    library(zoo)
    
    R2 <- function(x) {
      x <- as.data.frame(x)
      c(YEAR = tail(x$YEAR, 1), R2 = summary(lm(DV ~ IV, x))$r.squared)
    }
    
    df %>%
      group_by(ID) %>%
      do(data.frame(rollapply(.[-1], 20, by = 4, R2, by.column = FALSE))) %>%
      ungroup
    

    给予:

    # A tibble: 12 x 3
       ID     YEAR      R2
       <fct> <dbl>   <dbl>
     1 1      2005 0.0133 
     2 1      2006 0.130  
     3 1      2007 0.0476 
     4 1      2008 0.0116 
     5 1      2009 0.00337
     6 1      2010 0.00570
     7 2      2005 0.0481 
     8 2      2006 0.00527
     9 2      2007 0.0158 
    10 2      2008 0.0303 
    11 2      2009 0.235  
    12 2      2010 0.116  
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      相关资源
      最近更新 更多