2011-12-13 60 views
3

我想計算一下我的數據集上滾動中值的變體,它確實建立了子集,而不是通過前後的觀測值,但是通過考慮所有的觀測值給定時間窗口。隨着時間推移建立子集的滾動中值

一個直接implemtation看起來是這樣的:

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

然而,正如你可以想像,這是不適合大型數據集非常有效。您是否看到可能的改進或提供優化實施的軟件包?你不能指望隨着時間的推移平均分配觀測值。

zoo提供rollmedian,但此功能不提供基於時間選擇winwod,但在觀察計數。

+0

如果你添加一個玩具數據集,這將有助於提高興趣。另請參閱[這個問題](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

由於每個觀察的「時間戳」基本上來自您的描述,隨機的,沒有先驗的方式來確定哪些觀察值適合給定的窗口。也就是說,我想知道使用'outer()'是否具有合適的時間寬度功能可能至少會爲您創建一套完整的窗口樣本集。我必須走出去玩那個。 –

回答

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比這更清潔的方式,但最終的結果是「過濾器矩陣」任何你想要的功能應用於。

+0

+1 - 非常好。我總是欣賞「外部」解決方案的優雅! (順便說一句,希望你不介意我的編輯到你的答案,我只做了B/C我知道你可以改回它,如果你這樣做。) –

+0

Hmph-無論你編輯的肉眼不明顯: - ),所以我幾乎不能抱怨。 –

+0

如果您有興趣查看編輯,您可以點擊編輯器名稱上方的'編輯X小時/天前'鏈接查看它們(此處爲Josh O'Brien)。乾杯。 –

相關問題