2012-05-05 200 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個參賽作品。 (注:我想嘗試使用xts,但xts似乎需要最新信息,而當它不是有關我寧可不使用某個特定日期)

我的目標如下:

  • 確定每個點前3分鐘和後3分鐘的值的索引。隨着時間的延續,我懷疑任何兩點相隔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分鐘,tDelta = 180。如果t=2500,則forwardIX()結果將是3012(即時間(vecZ)[2500]爲860.1462,和時間(vecZ)[3012]爲1040.403,或者僅僅超過180秒後),以及backwardIX()輸出將是2020 (相當於時間680.7162秒)。

    理想情況下,我想使用不需要t的函數,因爲這需要調用函數length(vecZ),這忽略了可以更有效地計算時間滑動窗口這一事實。

  • 將函數應用於時間滾動窗口中的所有值。我見過rollapply,它採用固定的窗口大小(即固定數量的索引,但不是固定的時間窗口)。我可以解決這個用簡單的方式,與被每個索引t計算出的循環(或foreach ;-)),但我不知道是否有已經實施了一些簡單的功能,例如計算給定時間範圍內所有值的平均值的函數。由於這可以通過滑過窗口的簡單統計數據來高效地完成,因此它應該比計算每次統計數據的函數在計算上要便宜得多。一些相當自然的功能:平均值,最小值,最大值和中位數。

    即使窗口不受時間變化,來改變窗口大小的能力就足夠了,我可以找到使用上述問題的結果是窗口大小。但是,這似乎仍然需要額外的計算,因此能夠指定基於時間間隔似乎更有效。

R中是否有軟件包可以幫助在時間窗口中對數據進行操作,或者我運氣不好,我應該編寫自己的函數?


注1:This question試圖做同樣的事情,但在不相交的區間,而不是滾動的時間窗,如我可以適應這種情況,對每個連續3分鐘的塊進行分析,但我沒有看到一種方法來適應3分鐘的間隔。注2:我發現從zoo對象切換到數值向量(時間)顯着加快了第一個目標的測距/窗口端點識別問題。這仍然是一種天真的算法,但值得一提的是,使用zoo對象可能不是最理想的方法。

+0

我想'xts'可能是要走的路。參見'?endpoints','?to.period','?period.apply'和'?split.xts'。強制你的對象是這樣的xts:'x < - .xts(vecVals,vecTimes)' – GSee

+0

@Gee謝謝,雖然在我看來,這些函數將數據拆分成連續的,不相交的間隔(如附註I問題)。如果有辦法讓時間滑動/滾動窗口,我還沒有想出如何使'xts'做到這一點。 – Iterator

+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 
相關問題