不規則な時系列データセットの興味深い統計を抽出しようとしていますが、その仕事に適したツールを見つけることができません。定期的にサンプリングされた時系列またはインデックスベースの時系列をいつでも操作するためのツールは非常に簡単に見つかりますが、解決しようとしている問題にはあまり運がありません。
まず、再現可能なデータセット:
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)
時間は秒単位であると想定します。シリーズにはほぼ1700秒(30分は恥ずかしがり屋)があり、vecZ
その間に5001のエントリがあります。(注:を使用してみxts
ますがxts
、日付情報が必要なようです。関連性がない場合は、特定の日付を使用したくありません。)
私の目標は次のとおりです。
各ポイントの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 = 180
。の場合t=2500
、の結果はforwardIX()
3012(つまり、time(vecZ)[2500]は860.1462、time(vecZ)[3012]は1040.403、つまり180秒後)になり、の出力はbackwardIX()
2020(に対応)になります。時間680.7162秒)。t
理想的には、関数の呼び出しが必要になるため、を必要としない関数を使用したいと思いlength(vecZ)
ます。これは、時間のスライディングウィンドウをより効率的に計算できるという事実を無視します。時間のローリングウィンドウ内のすべての値に関数を適用します。私はこれを見てきまし
rollapply
たが、これは固定のウィンドウサイズを取ります(つまり、インデックスの数は固定されていますが、時間のウィンドウは固定されていません)。foreach
インデックスごとに計算されるループ(または;-))を使用して、これを単純な方法で解決できt
ますが、特定の時間枠内のすべての値の平均を計算する関数など、いくつかの単純な関数がすでに実装されているかどうか疑問に思いました。これは、ウィンドウ上をスライドする単純な要約統計量を介して効率的に実行できるため、すべてのデータに複数回アクセスして各統計量を計算する関数よりも計算コストが低くなるはずです。いくつかのかなり自然な関数:平均、最小、最大、および中央値。ウィンドウが時間によって変化していなくても、ウィンドウサイズを変化させる機能は十分であり、上記の質問の結果を使用してそのウィンドウサイズを見つけることができます。ただし、それでも過剰な計算が必要になるようであるため、時間ベースの間隔を指定できる方が効率的です。
時間枠でのデータのそのような操作を容易にするパッケージがRにありますか、それとも運が悪かったので、独自の関数を作成する必要がありますか?
注1:この質問は、時間のウィンドウをローリングするのではなく、ばらばらの間隔を除いて、同様のことをしようとしています。たとえば、これを適応させて、連続する3分ごとのブロックで分析を行うことができますが、これを適応させる方法がわかりません。 3分間隔でローリングします。
注2:オブジェクトから数値ベクトルへの切り替えzoo
(時間の場合)により、最初の目標の距離測定/ウィンドウエンドポイント識別の問題が大幅にスピードアップしたことがわかりました。これはまだ単純なアルゴリズムですが、zoo
オブジェクトの操作は単純なアプローチには最適ではない可能性があることに注意してください。