首页 > 解决方案 > 在每个循环中使用具有新日期范围的数据子集运行 For 循环

问题描述

所以我有一组日期和相应的值,我想通过 for 循环运行。挑战是我想在每次 for 循环运行时定义一组新的日期。这是为了测试领先和滞后变量。假设数据如下所示:

Date       Y      X
2000 Q1    100    1.5
2000 Q2    50     2
2000 Q3    75     -1
2000 Q4    25     0
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1
2001 Q4    80     2
2002 Q1    0      0
2002 Q2    0      1
2002 Q3    500    1
2002 Q4    0      0

现在我如何编写一个 for 循环来每次选择一个新的日期范围,以便我可以回归 Y 与 X?我想这会是这样的:

for(i in (range of dates)){
    test <- data %>% filter(Date > min(range of dates) &
                            Date < max(range of dates)
    lm(Y~X, test)}

for 循环选择的数据样本如下所示:

Date       Y      X
2000 Q1    100    1.5
2000 Q2    50     2
2000 Q3    75     -1
2000 Q4    25     0
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1

下一次迭代:

Date       Y      X
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1
2001 Q4    80     2
2002 Q1    0      0
2002 Q2    0      1
2002 Q3    500    1
2002 Q4    0      0

因此,每次 for 循环运行时,它都会忽略第一年并选择一个新的年份继续样本的末尾。

标签: rfor-looptidyr

解决方案


> library(tidyverse)
> df <- data.frame(
    Date = c(
      paste0('2000 Q', 1:4),
      paste0('2001 Q', 1:4),
      paste0('2002 Q', 1:4)
    ),
    Y = c(
      100, 50, 75, 25,
      0, 1000, 40, 80,
      0, 0, 500, 0
    ),
    X = c(
      1.5, 2, -1, 0,
      3, 4, 1, 2,
      0, 1, 1, 0
    ),
    stringsAsFactors = FALSE
  )

> df
      Date    Y    X
1  2000 Q1  100  1.5
2  2000 Q2   50  2.0
3  2000 Q3   75 -1.0
4  2000 Q4   25  0.0
5  2001 Q1    0  3.0
6  2001 Q2 1000  4.0
7  2001 Q3   40  1.0
8  2001 Q4   80  2.0
9  2002 Q1    0  0.0
10 2002 Q2    0  1.0
11 2002 Q3  500  1.0
12 2002 Q4    0  0.0

> year_range <- df %>% transmute(
    years = str_sub(
      Date, start = 1L, end = 4L
    )
  ) %>% unique() %>% pull() # Extract unique years

> for (cur_year in 1:(length(year_range) - 1)) {

    test <- df %>% filter(
      str_sub(
        Date, start = 1L, end = 4L
      ) %in% c(
        year_range[cur_year],
        year_range[cur_year + 1]
      )
    )

    print(
      lm(
        formula = Y ~ X, 
        data = test
      )
    )

  }

从上面的 s 打印的输出lm涵盖了这些年2000-2001然后2001-2002

称呼:
lm(公式 = Y ~ X, 数据 = 测试)

系数:
(拦截)X  
     -25.78 126.10  


称呼:
lm(公式 = Y ~ X, 数据 = 测试)

系数:
(拦截)X  
     -40.71 162.14  

推荐阅读