2017-03-25 209 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。 –