【问题标题】:Rolling Median with subset building over time随时间推移构建子集的滚动中位数
【发布时间】:2012-01-19 07:11:24
【问题描述】:

我想在我的数据集上计算一个滚动中位数的变体,它确实不是通过将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。

【问题讨论】:

  • 如果你添加一个玩具数据集,这将有助于提高兴趣。另见this question
  • 由于根据您的描述,每个观察的“时间戳”基本上是随机的,因此没有先验方法来确定哪些观察适合给定窗口。也就是说,我想知道使用 outer() 和适当的时间宽度排序函数是否至少可以为您构建一套完整的窗口样本集。我得去玩玩了。

标签: r median


【解决方案1】:

好的,试试这个:

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 方式,但最终结果是您想要应用任何函数的“过滤矩阵”。

【讨论】:

  • +1 -- 非常好。我一直很欣赏基于outer 的解决方案的优雅! (顺便说一句,希望你不介意我对你的答案进行编辑。我只是这样做了,因为我知道如果你这样做了,你可以把它改回来。)
  • 哼——无论你编辑什么,肉眼都看不出来:-),所以我很难抱怨。
  • 如果您对查看编辑感兴趣,您可以通过单击编辑姓名上方的“已编辑 X 小时/天前”链接来查看它们(此处为 Josh O'Brien)。干杯。
  • 谢谢卡尔。但是,如何根据此解决方案获得中位数?我知道如何计算滚动平均值,但对于中位数,我的第一个想法是我仍然需要使用其中一个应用函数,现在使用预先计算的过滤器。你有别的想法吗?
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 2020-03-28
  • 2023-02-07
  • 2015-01-26
  • 2012-05-11
  • 2020-01-23
  • 1970-01-01
相关资源
最近更新 更多