R中滚动方式的重复向量

时间:2019-05-08 12:28:28

标签: r vector regression rolling-computation

说我想进行回归分析,从而应以滚动方式获取DV的数据输入。为了简化此过程,因此,我首先要“复制”该向量,从而据此滚动观察值。例如,请参见下面的数据结构。

# libraries #
library(dplyr)

# reproducible data # 
df1 <- 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))

df2 <- tibble(ID = as.factor(rep(c(1, 2), each = 120)),
              YEAR = rep(rep(c(2005:2010), each = 20), 2),
              IV = rnorm(240))

数据之所以具有这种结构,是因为df2中的数据是先前执行的回归(同样使用"rolling" data)的残差。

然后的目的是运行一个模型,其中df1中的观测值将被“滚动”:

  • 回归1:DV = df1中的第1-20行,IV = df2中的第1-20行
  • 回归2:DV = df1中的第5-25行,IV = df2中的第21-40行
  • 回归3:DV = df1中的第10-30行,IV = df2中的第41-60行
  • 依此类推

我解决此问题的方法是尝试以滚动方式“复制” df1,以使回归更易于执行。

目前,我尝试通过embed()包中的函数base滚动它,但是由于我的真实数据集很大,因此很快就变得一团糟。会不会有一个精致的dplyr替代方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以使用

v1 <- c(1, seq(5, nrow(df1), by = 4))
v2 <- seq(20, nrow(df1), by = 4)
i1 <- seq_len(min(c(length(v1), length(v2))))
lst1 <- map2(v1[i1], v2[i1], ~ df1 %>% 
                           slice(.x:.y))

类似地,使用'df2'

v11 <- seq(1, nrow(df2), by = 20)
v22 <- seq(20, nrow(df2), by = 20)
i2 <- seq_len(min(c(length(v11), length(v22))))
lst2 <- map2(v11[i2], v22[i2], ~ df2 %>% 
                           slice(.x:.y))

,然后使用map2在两个list的对应元素上应用函数

更新

正如OP提到的按“ ID”分组一样,一个选项是group_split按“ ID”分组,然后使用与上述相同的步骤

df1 %>%
    group_split(ID) %>% 
    map(~ {
      v1 <- c(1, seq(5, nrow(.x), by = 4))
      v2 <- seq(20, nrow(.), by = 4)
      i1 <- seq_len(min(c(length(v1), length(v2))))
      map2(v1[i1], v2[i1], function(x, y) .x %>%
           slice(x:y))
   })