2011-02-17 58 views
0

我有一些缺失数据的时间序列数据,我正在滚动窗口上运行一些估计函数。窗口长度不统一,每个变量的开始和结束日期都不相同。我想删除任何有缺失数据的窗口。窗户重叠,所以一个单独的缺失观察通常会从考虑中移除很多窗户。我想要的是从每个日期到包含它的窗口的映射。Matlab中高效的滚动窗口识别

目前,我有一个逻辑矩阵,其中每一天都有一行,然后每一列代表窗口中具有真值的窗口之一。然后,我可以将该矩阵分配给表示缺失数据的行,并且无论哪列包含任何真值都是无效窗口。问题是逻辑矩阵变大(10k x 10k〜100mb),可能会有很多。我可以转换为稀疏解决大小问题,但当窗口很长时,要移除的窗口的计算变得非常慢。

这听起来不像是一个应该是资源密集型(内存或计算)的问题,有没有更好的方法?

编辑:让我添加一个例子,这样可能会更清晰一些。假设所有的日期范围在1到100之间.Windows是1:10,2:11,3:12等等直到91:100(这些是统一的,但这个例子并不重要)。我有一个从5到25的系列,但有17的NaN。

那一个NaN击倒了十个窗口(8:17到17:26)。我想从观察17到8:17的窗口进行有效的映射。很显然,当窗户长度一致时,这很容易,但当窗户不规则时,什么是有效的方法?

+1

我不明白。`(date> = begin(i)&& data 2011-02-17 23:03:16

+0

@Oli我添加了一个例子,希望让事情更清楚。 – MatlabSorter 2011-02-18 02:22:26

回答

1

我编写了Jonas的解决方案,它结束了比什么我已经到位较慢。它确实消除了对大型阵列的需求,然而,它让我以不同的方式思考问题。我只需要从一个窗口 - >(obs start,obs end)映射到一个obs - >(obs落入的每个窗口的索引)方法。因此,我建立一个单元阵列,其中包含每一天的每一组窗口索引(我可以使用NumObsx2矩阵,但我想允许可能复杂的窗口定义)。对于每个时间序列,我使用每个缺失数据点的索引来映射子集,以获得需要删除的所有窗口的索引。然后cell2mat将索引从单元阵列中拉出来,我可以移除坏窗口(谢天谢地,Matlab不关心分配中的重复索引)。

在我的计时中,这种方法大约是我原来的方法的10倍,比乔纳斯的方法大15倍。地图中的索引可以存储为uint16,所以所需的内存远远小于我的信号解决方案(但仍然超过Jonas的方法)。

作为奖励,如果我想使用更复杂的标准,例如不超过5个NaNs(参考不超过一个描述),我可以使用accumarray来计算指数。

3

逻辑比较花费的时间和资源很少。你确定这是一个瓶颈吗?

如果窗口创建非常耗时,您可能需要在while -loop中执行此操作,以便在窗口内遇到NaN时可以跳过几个条目。

如果窗口创建速度快,它肯定会是均匀的长度,你可以简单地做

%# startEnd is created according to your example, but can be whatever quick method 
startEnd = [(1:(100-windowSize+1))',(windowSize+1:100)']; 
nanIdx = find(isnan(data))'; %'# 

%# This line temporarily creates a logical array of size nWindows-by-numberOfNaNs 
%# which is most likely smaller than nWindows-by-nWindows 
badWindows = any(bsxfun(@le,startEnd(:,1),nanIdx) & bsxfun(@ge,startEnd(:,2),nanIdx),2); 

startEnd(badWindows,:) = []; 
+0

感谢您的回复。我曾考虑过这种方法 - 问题是我们最终做了大量的冗余isnan检查(每个窗口的每次观察都是在这个窗口内进行的,而不是每次观察一次)。如果每个窗口大约有一百个观测值,那么每个观测值我们将检查(几乎)100次。我想检查时间序列一次,然后将其映射到窗口中。 – MatlabSorter 2011-02-18 02:14:09