3

データセットでローリングメジアンのバリアントを計算したいと思いkます。これは、観測を前後に移動するのではなく、特定の時間枠内のすべての観測を考慮に入れてサブセットを構築します。

簡単な実装は次のようになります。

windowwidth <- 30
median.window <- function(x) median(mydata[time <= x + windowwidth /2 & time >= x - windowwidth /2)
vapply(time, median.window)

ただし、ご想像のとおり、これは大規模なデータセットにはあまり効率的ではありません。改善の可能性や、最適化された実装を提供するパッケージがありますか?観測値が時間の経過とともに均等に分散されることは期待できません。

zooを提供しますrollmedianが、この関数は、時間ではなく観測数に基づいてwinwodを選択することを提供しません。

4

1 に答える 1

2

わかりました、これを試してください:

Rgames: timeseq<-1:5 
Rgames: winmat <- outer(timeseq,timeseq,FUN=function(x,y) y>=x &y<=x+2) 
Rgames: winmat 
      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,]  TRUE  TRUE  TRUE FALSE FALSE 
[2,] FALSE  TRUE  TRUE  TRUE FALSE 
[3,] FALSE FALSE  TRUE  TRUE  TRUE 
[4,] FALSE FALSE FALSE  TRUE  TRUE 
[5,] FALSE FALSE FALSE FALSE  TRUE 
Rgames: winmat %*% timeseq 
     [,1] 
[1,]    6 
[2,]    9 
[3,]   12 
[4,]    9 
[5,]    5 

その関数をウィンドウの幅に置き換えれば、すべて設定できると思います。
編集: Thilo のクエリへの応答では、一般的なケースではapply. 上記のものを考えると、観測値を「timval」と呼びます。

Rgames: timval<-c(3,4,2,6,1)
Rgames: valmat<-timval*t(winmat)
Rgames: valmat
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    0    0    0    0
[2,]    4    4    0    0    0
[3,]    2    2    2    0    0
[4,]    0    6    6    6    0
[5,]    0    0    1    1    1
Rgames: apply(valmat,2,median)
[1] 2 2 1 0 0

もう一度編集してください:明らかに私はそこで眠っていました:誰もそれらすべてのゼロに基づく中央値を望んでいません. 投稿する前にもっと考えるべきです。これを追加:

valmat[valmat==0]<- NA
apply(valmat,2, median, na.rm=T)
[1] 3.0 4.0 2.0 3.5 1.0

そして、これよりもクリーンな「構築」方法があると確信して valmatいますが、最終結果は、任意の関数を適用する「フィルターマトリックス」です。

于 2011-12-13T14:59:06.573 に答える