2017-03-25 171 views
1

我想对y运行x的MIDAS回归。 x是每周数据,y是每月。为了做到这一点,周数应该可以被月份整除,反之亦然,那么周应该是月份的倍数。将每日数据汇总为每周自定义4周月

问题是,几个月的周数(4-5)不同,所以上述条件不成立。因此,我想转换数据,以便每个月包含4周。

我首先想到来分解每周数据(星期六开始),以每日数据,然后定义自定义周即

第1周:1-8天, 第2周: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

你能澄清你想要做什么吗?你只是希望在日常数据中将'hhits'的平均值超过'week'的值? – ulfelder

+0

@ulfelder我希望平均每周数次,但每个月应该包含严格的4周。 –

+0

但是365/28是13.0357等,也就是说,在几年内整齐地嵌套的巢穴中,你无法获得7天的周期。在时间序列分析中这是一个非常烦人的问题,但它在那里,而且你不能把它算出来。 – ulfelder

回答

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)。

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 
+0

首先感谢您的努力。其次,因为我是一个基本的R用户,所以我对这种方法的工作原理感到迷茫,所以我只是将它作为脚本应用到我的工作区。我得到这个错误: '使用方法错误(“group_by_”): 没有适用于'group_by_'的方法应用于类“function”的对象 ' –

+0

您是否将youb'ddate转换为as.Date df $ ddate,format ='%Y-%m-%d')' – Sotos

+0

对不起,我忘了更改我的数据框的名称。我现在做了,但我得到了另一个错误:'在mutate_impl(.data,点)错误: 不兼容的大小(1821),期待1(组大小)或1'我的数据框有1821行btw。 –