说我想进行回归分析,从而应以滚动方式获取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中的观测值将被“滚动”:
我解决此问题的方法是尝试以滚动方式“复制” df1,以使回归更易于执行。
目前,我尝试通过embed()
包中的函数base
滚动它,但是由于我的真实数据集很大,因此很快就变得一团糟。会不会有一个精致的dplyr替代方案?
谢谢!
答案 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))
})