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,而是根据观察次数选择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 回答