在R中以滚动方式重复的载体



说我想运行一个回归,该回归应以滚动方式获取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中的数据是同样使用"滚动"数据的早期执行回归中的残差。

然后,目的是运行一个模型,在该模型中,df1中的观察值是"滚动"的:

  • 回归1:dv = df1中的1-20行,iv = df2中的1-20行
  • 回归2:dv = df1中的第5-25行,iv =行21-40 in df2
  • 回归3:dv = df1中的10-30行,iv =行41-60 in df2
  • 等等

我解决这个问题的方式是尝试以滚动方式"重复" DF1,以使回归更容易执行。

目前,我尝试通过base软件包中的函数embed()滚动它,但是由于我的真实数据集更大,这很快就变得一团糟。会有优雅的dplyr选择吗?

谢谢!

我们可以使用

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 S

的相应元素上应用功能

更新

正如" ID"分组的OP所述,一个选项是 group_split by" 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))
   })

最新更新