불규칙한 시계열 데이터 세트에 대한 흥미로운 통계를 추출하려고하지만 작업에 적합한 도구를 찾지 못했습니다. 정기적으로 샘플링 된 시계열 또는 인덱스 기반 시리즈를 조작하는 도구는 쉽게 찾을 수 있지만 해결하려는 문제는별로 없습니다.시계열 데이터에 대한 슬라이딩 시간 간격 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
개체로 작업하는 것이 순진한 접근 방식에 최적이 아닐 수 있음을 언급 할 필요가 있습니다.
이'xts' 아마 길을 가야하는 것입니다 귀하의 질문에 대답을 잘 모르겠어요. '? endpoints','? toperiod','? period.apply' 및'? split.xts'를보십시오. 객체를 xts에 강제로 변형 시키십시오 :'x <- .xts (vecVals, vecTimes)' – GSee
@GSee 그 함수는 데이터를 연속적으로 분리 된 간격으로 나누었습니다. 질문). 슬라이딩/롤링 윈도우를 만드는 방법이 있다면,'xts'가 그렇게하는 방법을 아직 알지 못했습니다. – Iterator
너는 0 너비의 엄격히 규칙적인 xts 객체와'na.locf'와 병합하여 데이터를 엄격하게 규칙적으로 얻을 수있다. 그럼'rollapply'를 사용하십시오. – GSee