滚动中位数与子集建设随着时间的推移

时间:2011-12-13 11:52:33

标签: r median

我想在我的数据集上计算滚动中位数的变体,它不会通过前后k观察来构建子集,而是通过考虑在给定时间窗口内的所有观察结果

直接的实现可能如下所示:

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

但是,正如您可以想象的那样,这对于大型数据集来说效率不高。您是否看到了可能的改进或提供优化实施的包?你不能指望观察结果随着时间的推移而平均分配。

zoo提供rollmedian,但此功能不提供基于时间而是根据观察计数选择winwod。

1 个答案:

答案 0 :(得分: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的方法,但最终的结果是你想要应用任何函数的“过滤矩阵”。