【问题标题】:Aggregate daily data to weekly with custom 4 week month使用自定义的 4 周月将每日数据汇总到每周
【发布时间】:2017-03-25 09:35:38
【问题描述】:

我想在 y 上运行 x 的 MIDAS 回归。 x 是每周数据,y 是每月数据。为了做到这一点,周数应该能被月数整除,反之亦然,周数应该是月数的倍数。

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

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

第 1 周:1-8 天, 第二周:9-15, 第三周: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 月的最后一个自定义周。

【问题讨论】:

  • 您能澄清一下您要做什么吗?您只希望每日数据中 hhits 的平均值超过 week 的值?
  • @ulfelder 我希望每周平均有 hhits,但每个月应该包含严格的 4 周。
  • 但是 365/28 是 13.0357 等等。也就是说,你不能得到 7 天的周数,这些周数月内整齐排列,而数年排列整齐。这在时间序列分析中是一个非常烦人的问题,但它就在那里,你无法用数学计算。

标签: r aggregate


【解决方案1】:

如果您没有缺失值,您几乎可以忽略日期列并执行以下操作:

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

【讨论】:

    【解决方案2】:

    这是一种使用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
    

    【讨论】:

    • 首先感谢您的努力。其次,由于我是一个基本的 R 用户,我对这种方法的工作原理有点迷茫,所以我只是将它作为脚本应用到我的工作区。我收到此错误:Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "function"
    • 你把youbddate转换成as.Date(df$ddate, format = '%Y-%m-%d')了吗
    • 对不起,我忘了更改数据框的名称。我现在做了,但又遇到了另一个错误:Error in mutate_impl(.data, dots) : incompatible size (1821), expecting 1 (the group size) or 1 我的数据框有 1821 行 btw。
    • 尝试自己运行get_groups,即get_groups(df$hhits)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多