所以我有一组日期和对应的值,我想通过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循环运行时,它就省去了第一年并选择一个新的年份作为示例的结尾。
答案 0 :(得分:0)
> 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
)
)
}
以上lm
所覆盖的年份2000
-2001
然后是2001
-2002
的输出是
Call: lm(formula = Y ~ X, data = test) Coefficients: (Intercept) X -25.78 126.10 Call: lm(formula = Y ~ X, data = test) Coefficients: (Intercept) X -40.71 162.14