我想在我的数据集上计算滚动中位数的变体,它不会通过前后k
观察来构建子集,而是通过考虑在给定时间窗口内的所有观察结果
直接的实现可能如下所示:
windowwidth <- 30
median.window <- function(x) median(mydata[time <= x + windowwidth /2 & time >= x - windowwidth /2)
vapply(time, median.window)
但是,正如您可以想象的那样,这对于大型数据集来说效率不高。您是否看到了可能的改进或提供优化实施的包?你不能指望观察结果随着时间的推移而平均分配。
zoo
提供rollmedian
,但此功能不提供基于时间而是根据观察计数选择winwod。
答案 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
的方法,但最终的结果是你想要应用任何函数的“过滤矩阵”。