2011-02-17 57 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