2012-05-05 9 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日付情報を必要とするようで、それは関係ありませんだとき、私はむしろ、特定の日付を使用していないと思いNB。):

  • 各ポイントの3分前および3分後の値のインデックスを特定します。時間が連続的なので、私はどの2つのポイントも正確に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 = 180t=2500の場合、forwardIX()の結果は3012となる(つまり、time(vecZ)[2500]は860.1462、time(vecZ)[3012]は1040.403、または180秒をわずかに上回る)、backwardIX()の出力は2020 (時間680.7162秒に対応)。

    理想的には、私はそれが時間のスライディングウィンドウがより効率的に計算することができるという事実を無視する機能、へlength(vecZ)の呼び出しを必要としているとして、tを必要としない機能を使用したいと思います。

  • ローリングウィンドウ内のすべての値に関数を適用します。私はrollapplyを見てきましたが、これは固定のウィンドウサイズ(インデックスの固定数ですが固定時間ウィンドウではありません)をとります。私は単純な関数が既に実装されているかどうかを尋ねましたが、インデックスtで計算されるループ(またはforeach ;-))を使ってこれを単純な方法で解決できます。所与の時間枠内のすべての値の平均を計算する関数。これは、ウィンドウ上をスライドする単純な要約統計によって効率的に行うことができるので、各統計を計算するために、すべてのデータに複数回アクセスする関数よりも計算上安価でなければなりません。いくつかのかなり自然な関数:平均値、最小値、最大値、および中央値。

    時間によってウィンドウが変化しない場合でも、ウィンドウサイズを変更する能力は十分であり、上記の質問の結果を使用してそのウィンドウサイズを見つけることができます。しかし、それでも余分な計算が必要と思われるので、時間ベースのインターバルを指定できる方が効率的です。

時間ウィンドウでのデータの操作を容易にするパッケージがありますか?それとも、私自身の関数を書くべきですか?


注1:This questionではなく、例えば、時間の窓を転がすよりも、ばらばらの間隔で除いて、同様の何かをしようこれを3分ごとに分析してもらうことができましたが、3分間隔で回転させる方法はありません。

注2:zooオブジェクトから数値ベクトルに切り替えると、最初の目標の範囲検出/ウィンドウのエンドポイント識別の問題が大幅にスピードアップすることがわかりました。これはまだ未知のアルゴリズムですが、zooオブジェクトでの作業は、素朴なアプローチには最適でない可能性があることに言及する価値があります。

+0

は 'xts'はおそらく移動するための方法は、あなたの質問に答えるかわかりません。 '?endpoint.'、'?to.period'、 '?period.apply'、'?split.xts'を参照してください。 'x < - .xts(vecVals、vecTimes)' – GSee

+0

@GSeeこれらの関数は、データを連続した不連続な区間に分割しているように思えます。質問)。スライディングウィンドウやローリングウィンドウを作る方法があるなら、私は '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