2015-10-19 56 views
0

在matlab中使用指數函數時應如何處理nan's?如何使用指數平滑函數處理nans

例如,我可以使用的指數平滑函數爲:

v = datenum(2008, 1, 1):datenum(2010, 11, 31); % time vector 
d = rand(1,length(v)); % data vector 

fd = d; 
alpha_o = 0.2; 
for ii = 2:length(fd); 
    fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1); 
end 

plot(v,d); hold on; plot(v,fd); 

然而,如果我在時間序列楠(或許多的NaN事實證明):

d(10) = nan; 

隨着時間序列中nan的位置,平滑輸出將爲nan。

這應該怎麼處理?我應該刪除所有的nans然後運行該功能嗎?

我在想,對我的數據使用指數平滑函數的一點是,它提供了原始系列的平滑和滯後版本。但是,如果你有被移除的nans不會導致結果中的錯誤?

我看到這個帖子Using exponential smoothing with NaN values,但它並沒有真正提供任何有用的提示,我可以在這裏適用。

我也想避免楠零件,並說,如果男,使用最後一個已知的平滑值:

fd = d; 
alpha_o = 0.2; 
for ii = 2:length(fd); 
    if isnan(fd(ii)) == 1; 
     fd(ii) = fd(ii-1); 
    else 
     fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1); 
    end 
end 
plot(v,d); hold on; plot(v,fd); 

這是最好的解決辦法?不知道如果第一個值是nan認爲我會怎麼做...

+0

你對待nans的方式是你的選擇。你可以刪除它們,你可以用插值填充它們,或者你可以讓你的算法輸出NaN作爲NaN輸入。這取決於你的NaN是什麼以及如何創建的。 –

+0

如果您正在進行平滑和插值,通常會刪除您的NaN,因爲它們會影響您的結果。 – GameOfThrows

+0

我不確定這是否是適合StackOverflow的問題。這是非常基於觀點的,取決於你的具體情況以及你希望達到的目標,這在你的問題中是不明確的。 – IKavanagh

回答

2

如果在您的數據中有nan s,那麼在進行這樣的處理時,您應該完全忽略它們(如果這些點是0?-inf? inf?10.5?pi?)。主要的一點是,作爲@IKavanagh指出的那樣,你必須真正忽略這些點完全,即下降了v元素,以及對應於nan S:

v = datenum(2008, 1, 1):datenum(2010, 11, 31); % time vector 
d = rand(1,length(v)); % data vector 

d(10) = nan; 

v = v(~isnan(d)); 
d = d(~isnan(d)); 

%do the rest of the processing as usual 

fd = d; 
alpha_o = 0.2; 
for ii = 2:length(fd); 
    fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1); 
end 

plot(v,d); hold on; plot(v,fd); 

nan s爲存在於事實的數據告訴你這些數據點是無效的,所以你必須擺脫他們的平滑/擬合(並且plot將自動忽略這些)。