2012-05-05 2 views
13

불규칙한 시계열 데이터 세트에 대한 흥미로운 통계를 추출하려고하지만 작업에 적합한 도구를 찾지 못했습니다. 정기적으로 샘플링 된 시계열 또는 인덱스 기반 시리즈를 조작하는 도구는 쉽게 찾을 수 있지만 해결하려는 문제는별로 없습니다.시계열 데이터에 대한 슬라이딩 시간 간격 R

우선, 재생 가능한 데이터 세트 :

library(zoo) 
set.seed(0) 
nSamples <- 5000 
vecDT  <- rexp(nSamples, 3) 
vecTimes <- cumsum(c(0,vecDT)) 
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01)) 
vecVals  <- cumsum(vecDrift) 
vecZ  <- zoo(vecVals, order.by = vecTimes) 
rm(vecDT, vecDrift) 

는 시간 (초) 가정하자. vecZ 시리즈에는 거의 1700 초 (30 분이면 수다름 함)이며 그 시간 동안 5001 개의 항목이 있습니다. (NB :. 내가 xts를 사용하려고 노력하지만, 날짜 정보를 필요로 xts 것, 그리고 그것과 관련이없는 때 차라리 특정 날짜를 사용하지 않는 게 좋을거야)

내 목표

는 다음과 같습니다

  • 각 포인트의 3 분 전과 3 분 후에 값의 인덱스를 식별하십시오. 시간이 연속적이기 때문에 어떤 두 지점이 정확히 3 분 간격으로 떨어져 있는지 의심 스럽습니다.

    backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta} forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}

    : 내가 발견하고 싶은 무엇 전에 대부분의 삼분에있는 점, 이후 3 분 이상, 주어진 점, 즉 (의사 코드) 다음과 같은 수 있습니다 그래서 3 분 동안 tDelta = 180. t=2500이면 forwardIX()에 대한 결과는 3012입니다 (즉, 시간 (vecZ) [2500]은 860.1462이고 시간 (vecZ) [3012]는 1040.403 또는 180 초 조금 넘었습니다). backwardIX()의 출력은 2020이됩니다 (시간 680.7162 초에 해당).

    이상적으로는 t이 필요하지 않은 함수를 사용하고 싶습니다.이 함수는 length(vecZ) 함수를 호출해야하므로 시간 슬라이딩 창이 더 효율적으로 계산된다는 사실을 무시합니다.

  • 롤링 시간의 모든 값에 함수를 적용하십시오. rollapply은 고정 된 창 크기 (즉 고정 된 인덱스 수이지만 고정 시간 창은 아닙니다)를 사용합니다. 루프 (또는 foreach ;-))로 인덱스 t 당 계산되는 순진한 방법을 해결할 수 있지만 이미 구현 된 몇 가지 간단한 기능이 있는지 궁금해했습니다. 주어진 시간 프레임에서 모든 값의 평균을 계산하는 함수. 이 작업은 창 위로 이동하는 간단한 요약 통계를 통해 효율적으로 수행 할 수 있으므로 모든 통계를 계산하기 위해 모든 데이터에 여러 번 액세스하는 함수보다 계산 상 더 저렴해야합니다. 상당히 자연스러운 기능 : 평균, 최소, 최대 및 중간 값.

    시간에 따라 창이 변하지 않아도 창 크기를 다양하게 지정할 수 있으며 위 질문의 결과를 사용하여 창 크기를 찾을 수 있습니다. 그러나 여전히 과도한 계산이 필요하므로 시간 기반 간격을 지정할 수있는 것이 더 효율적으로 보입니다.

시간 창에서 이러한 데이터 조작을 용이하게하는 패키지가 있습니까? 아니면 운이 좋을까요? 그리고 제 자신의 기능을 작성해야합니까?


주 1 : This question 오히려 예를 들면, 시간의 창을 압연보다, 분리 된 간격 이상을 제외하고, 비슷한 일을하고자3 분 간격으로 분석 할 때마다이 방법을 적용 할 수는 있지만 3 분 간격으로 롤을 조정하는 방법은 없습니다.

참고 2 : zoo 개체에서 숫자 벡터로 전환하면 첫 번째 목표의 범위 찾기/창 끝점 식별 문제가 상당히 빨라졌습니다. 그것은 여전히 ​​순진한 알고리즘이지만, zoo 개체로 작업하는 것이 순진한 접근 방식에 최적이 아닐 수 있음을 언급 할 필요가 있습니다.

+0

이'xts' 아마 길을 가야하는 것입니다 귀하의 질문에 대답을 잘 모르겠어요. '? endpoints','? toperiod','? period.apply' 및'? split.xts'를보십시오. 객체를 xts에 강제로 변형 시키십시오 :'x <- .xts (vecVals, vecTimes)' – GSee

+0

@GSee 그 함수는 데이터를 연속적으로 분리 된 간격으로 나누었습니다. 질문). 슬라이딩/롤링 윈도우를 만드는 방법이 있다면,'xts'가 그렇게하는 방법을 아직 알지 못했습니다. – Iterator

+0

너는 0 너비의 엄격히 규칙적인 xts 객체와'na.locf'와 병합하여 데이터를 엄격하게 규칙적으로 얻을 수있다. 그럼'rollapply'를 사용하십시오. – GSee

답변

1

는 여기에 내가 suggeting 있었는지,하지만 난 그게 정확히 내가 생각

#Picking up where your code left off 
library(xts) 
library(TTR) 
x <- .xts(vecZ, vecTimes) 
xx <- na.locf(cbind(xts(, seq.POSIXt(from=start(x), to=end(x), by='sec')), x)) 
x$means <- runMean(xx, n=180) 
out <- x[!is.na(x[, 1]), ] 
tail(out) 

            x  means 
1969-12-31 18:28:17.376141 0.2053531 0.1325938 
1969-12-31 18:28:17.379140 0.2101565 0.1329065 
1969-12-31 18:28:17.619840 0.2139770 0.1332403 
1969-12-31 18:28:17.762765 0.2072574 0.1335843 
1969-12-31 18:28:17.866473 0.2065790 0.1339608 
1969-12-31 18:28:17.924270 0.2114755 0.1344264