2015-10-19 73 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将自动忽略这些)。