我想在y上运行x的MIDAS回归。 x是每周数据,y是每月。为了做到这一点,周数应该可以被几个月整除,反之亦然,周数应该是几个月的倍数。
问题是几个月的周数(4-5)不同,所以上述情况不成立。因此,我想转换数据,以便每个月包含4周。
我首先想到将每周数据(从星期六开始)分解为每日数据,然后定义自定义周数,即
第1周:1-8天, 第二周:9-15, 第3周:16-23, 第4周:24-30或31
我设法将每周数据分解成每日,但我很难在周月形式中将它们汇总回来。通过汇总我的意思是取平均值。
#Original Data
Date Hits wday
1 2012-03-24 81 7
2 2012-03-31 77 7
3 2012-04-07 80 7
4 2012-04-14 83 7
5 2012-04-21 83 7
6 2012-04-28 83 7
#Daily data
ddate hhits wday mday month week
1 2012-03-24 81 7 24 3 12
2 2012-03-25 77 1 25 3 13
3 2012-03-26 77 2 26 3 13
4 2012-03-27 77 3 27 3 13
5 2012-03-28 77 4 28 3 13
6 2012-03-29 77 5 29 3 13
7 2012-03-30 77 6 30 3 13
8 2012-03-31 77 7 31 3 13
9 2012-04-01 80 1 1 4 14
10 2012-04-02 80 2 2 4 14
11 2012-04-03 80 3 3 4 14
12 2012-04-04 80 4 4 4 14
13 2012-04-05 80 5 5 4 14
14 2012-04-06 80 6 6 4 14
15 2012-04-07 80 7 7 4 14
16 2012-04-08 83 1 8 4 15
17 2012-04-09 83 2 9 4 15
18 2012-04-10 83 3 10 4 15
19 2012-04-11 83 4 11 4 15
20 2012-04-12 83 5 12 4 15
21 2012-04-13 83 6 13 4 15
22 2012-04-14 83 7 14 4 15
23 2012-04-15 83 1 15 4 16
24 2012-04-16 83 2 16 4 16
25 2012-04-17 83 3 17 4 16
#4week month
Date Hits
2012-03-4 77.5
2012-04-1 80
2012-04-2 83
...
其中值是前面定义的平均天数,2012-03-4代表3月的最后一个自定义周。
答案 0 :(得分:0)
如果您没有丢失值,您几乎可以忽略日期列并执行:
d = data.frame(val=rnorm(100))
crude_filler = function(i){
x = rep(1:(nrow(d)/i), each=i)
c(x, rep(max(x) + 1, each=nrow(d) - length(x)))
}
d$week = crude_filler(7)
d$month = crude_filler(28)
如果您缺少值,请先创建一个新的(完整)数据框:
x = data.frame(Date=seq.Date(min(x), max(x), by=1))
x = merge(x, your_data)
如果你急于在每周的某一天开始,你需要调整。您还可以考虑使用移动平均线(例如https://stackoverflow.com/a/4862334/2773500)。
答案 1 :(得分:0)
以下是一个使用dplyr
并创建分组变量的解决方案。
library(dplyr)
#create the function for grouping.
get_groups <- function(x){
l1 <- length(x) %/% 7
grp <- c(rep(seq(l1), each = 7), rep(tail(seq(l1), 1), length(x) - 7 * l1))
return(grp)
}
#apply it using dplyr,
#First make sure your ddate is as.Date(df$ddate),
df %>%
group_by(v1 = format(ddate, '%Y-%m')) %>%
mutate(grp = get_groups(hhits)) %>%
group_by(v1, grp) %>%
summarise(avg = mean(hhits)) %>%
ungroup()
# A tibble: 3 × 3
# v1 grp avg
# <chr> <int> <dbl>
#1 2012-03 1 77.5
#2 2012-04 1 80.0
#3 2012-04 2 83.0