使用指数平滑函数时如何处理nans

时间:2015-10-19 09:26:54

标签: matlab

在matlab中使用指数函数时应该如何处理?

例如,我可以使用指数平滑函数:

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(或者结果是很多nans):

{{1}}

根据时间序列中的nan位置,平滑后的输出将为nan。

应如何处理?我应该删除所有的nans然后运行该功能吗?

我认为在我的数据中使用指数平滑函数的意义在于它提供了原始系列的平滑和滞后版本。但是,如果你有删除的nans不会导致你的结果出错?

我看过这篇文章Using exponential smoothing with NaN values,但它确实提供了我可以在这里申请的任何有用的提示。

我还想过避免使用nan部分,并说nan是否使用最后已知的平滑值:

{{1}}

这是最好的解决方案吗?如果第一个值是纳思想的话,不确定我该做什么......

1 个答案:

答案 0 :(得分:2)

如果你的数据中有nan个,那么在进行这样的处理时你肯定会忽略它们(这些点应该是0?-inf?inf?10.5?pi?)。正如@IKavanagh指出的那样,要点是你必须完全忽略这些点,即删除与v对应的nan元素:

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的事实表明这些数据点无效,因此您必须摆脱它们以进行平滑/拟合(plot将自动忽略这些数据点)