2012-05-11 1 views
7

xts을 사용하여 일련의 이벤트 (게시물)가 불규칙하고 롤링 매주 창 (또는 격주 또는 3 일 등) 동안 발생하는 이벤트 수를 계산하고 싶습니다. 데이터는 다음과 같습니다 : 2 박 창불규칙한 시계열을 통한 롤링 창

    nposts 
2010-08-05 00:00:00  10 
2010-08-06 00:00:00  9 
2010-08-07 00:00:00  5 

같은 것을 생산해야

    postid 
2010-08-04 22:28:07 867 
2010-08-04 23:31:12 891 
2010-08-04 23:58:05 901 
2010-08-05 08:35:50 991 
2010-08-05 13:28:02 1085 
2010-08-05 14:14:47 1114 
2010-08-05 14:21:46 1117 
2010-08-05 15:46:24 1151 
2010-08-05 16:25:29 1174 
2010-08-05 23:19:29 1268 
2010-08-06 12:15:42 1384 
2010-08-06 15:22:06 1403 
2010-08-07 10:25:49 1550 
2010-08-07 18:58:16 1596 
2010-08-07 21:15:44 1608 

합니다. 나는 rollapply, apply.rollingPerformanceAnalytics 등으로 들여다 보았고, 이들은 모두 정규 시계열 데이터를 가정합니다. 나는 모든 시간을 단지 게시물이 발생한 날로 변경하고 ddply과 같은 것을 사용하여 매일 그룹화하여 닫히게했습니다. 그러나 사용자는 매일 게시하지 않을 수 있으므로 시계열은 여전히 ​​불규칙합니다. 0으로 간격을 채울 수는 있지만 데이터가 많이 부풀어 오르면 이미 상당히 커질 수 있습니다.

어떻게해야합니까?

+2

현재 XTS 패키지에 존재하지만,이 요청은 내가 해결책을 포함에 대해 생각하기 시작했습니다 충분히 등장하지 않는 이에 대한 솔루션입니다. –

+0

@JoshuaUlrich의 업데이트가 있습니까? 아니면 아래의 해답을 얻으려는 무언가가 누락 일을 0이나 NAs로 채울 것이므로 'rollapply'를 사용할 수 있습니까? 나는 병합을 사용할 수 있다고 생각한다. – flodel

+0

@flodel :이 질문은 내가 생각한 것을 필요로하지 않는다. (내 대답을 보라). 나는 원래 시리즈의 모든 관찰에서 'n'일을 되돌아보고 싶다고 생각했는데, 해결하기가 훨씬 더 어려운 문제입니다. –

답변

4

이 작동하는 것 같다 :

# n = number of days 
n <- 30 
# w = window width. In this example, w = 7 days 
w <- 7 

# I will simulate some data to illustrate the procedure 
data <- rep(1:n, rpois(n, 2)) 

# Tabulate the number of occurences per day: 
# (use factor() to be sure to have the days with zero observations included) 
date.table <- table(factor(data, levels=1:n)) 

mat <- diag(n) 
for (i in 2:w){ 
    dim <- n+i-1 
    mat <- mat + diag(dim)[-((n+1):dim),-(1:(i-1))] 
    } 

# And the answer is.... 
roll.mean.7days <- date.table %*% mat 

이 너무 느하지 될 것으로 보인다합니다 (mat 매트릭스는 치수 n 개의 * n을 얻을 것이다 있지만). 나는 n = 30을 n = 3000 (9 백만 개 요소 = 72 MB의 행렬을 생성 함)으로 대체하려고 시도했는데, 여전히 내 컴퓨터에서 빠르다. 매우 큰 데이터 세트의 경우 먼저 서브 세트를 사용해보십시오 .... 매트릭스 패키지 (bandSparse)의 일부 기능을 사용하여 mat 매트릭스를 만드는 것이 더 빠릅니다.

+0

이것은 롤링 윈도우를 무언가에 적용하는 좋은 방법이지만 실제 시간 세리에트 (원래 질문과 같이 POSIXct 날짜 - 시간 객체로 표현)에이를 적용하는 방법을 보여주는 예제를 제공하지 않는다면 거의 불가능합니다 질문에 답합니다. – plannapus

+0

불규칙한 간격의 POSIXct 객체'data <- sample (seq (as) .POSIXct ("2012/01/01"), as.POSIXct ("2012/01/31"), by = "hours" , 30)'를 사용하면'date.table' 행을 : date.table <- table (cut (data, "days"))'로 대체 한 다음 그 작업을 진행해야합니다. – plannapus

+0

plannapus, POSIXct 개체에 대한 추가 사항에 대해 감사드립니다. –

3

여기 XTS를 사용하여 해결책 :

x <- structure(c(867L, 891L, 901L, 991L, 1085L, 1114L, 1117L, 1151L, 
    1174L, 1268L, 1384L, 1403L, 1550L, 1596L, 1608L), .Dim = c(15L, 1L), 
    index = structure(c(1280960887, 1280964672, 1280966285, 
    1280997350, 1281014882, 1281017687, 1281018106, 1281023184, 1281025529, 
    1281050369, 1281096942, 1281108126, 1281176749, 1281207496, 1281215744), 
    tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts", "zoo"), 
    .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), 
    .indexTZ = "", tzone = "") 
# first count the number of observations each day 
xd <- apply.daily(x, length) 
# now sum the counts over a 2-day rolling window 
x2d <- rollapply(xd, 2, sum) 
# align times at the end of the period (if you want) 
y <- align.time(x2d, n=60*60*24) # n is in seconds