我有每个包含一个值序列作为行矢量的单元格数组。序列包含一些由 NaN.

我想使用某种插值方法替换所有NAN,如何在MATLAB中执行此操作?我也对如何处理这些缺失价值观的其他建议开放。

考虑此示例数据以说明问题:

seq = {randn(1,10); randn(1,7); randn(1,8)};
for i=1:numel(seq)
    %# simulate some missing values
    ind = rand( size(seq{i}) ) < 0.2;
    seq{i}(ind) = nan;
end

结果序列:

seq{1}
ans =
     -0.50782     -0.32058          NaN      -3.0292     -0.45701       1.2424          NaN      0.93373          NaN    -0.029006
seq{2}
ans =
      0.18245      -1.5651    -0.084539       1.6039     0.098348     0.041374     -0.73417
seq{3}
ans =
          NaN          NaN      0.42639     -0.37281     -0.23645       2.0237      -2.2584       2.2294

编辑:

根据响应,我认为存在一种混乱:显然我没有使用随机数据,上面显示的代码只是数据结构的一个示例。

实际数据是某种形式的处理信号。问题是,在分析过程中,如果序列包含缺失值,因此我的解决方案将失败,因此需要过滤/插值(我已经考虑使用每个序列的平均值来填充空白,但是我希望能有更强大的东西)

有帮助吗?

解决方案

好吧,如果您正在使用时间序列数据,则可以使用MATLAB内置的插值功能。

这样的事情应该适合您的情况,但是您需要对其进行一些量身定制...即。如果您没有平等的抽样,则需要修改 times 线。

nseq = cell(size(seq))
for i = 1:numel(seq)
    times = 1:length(seq{i});
    mask =  ~isnan(seq{i});
    nseq{i} = seq{i};
    nseq{i}(~mask) = interp1(times(mask), seq{i}(mask), times(~mask));

end

您需要选择 interp1 找出哪些最适合您的情况。

其他提示

我会用 inpaint_nans, ,一种工具,旨在通过插值替换1-D或2-D矩阵中的NAN元素。

seq{1} = [-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006];
seq{2} = [0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417];
seq{3} = [NaN NaN 0.42639 -0.37281 -0.23645 2.0237];

for i = 1:3
  seq{i} = inpaint_nans(seq{i});
end

seq{:}
ans =
 -0.50782 -0.32058 -2.0724 -3.0292 -0.45701 1.2424 1.4528 0.93373 0.44482 -0.029006

ans =
  0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417

ans =
  2.0248 1.2256 0.42639 -0.37281 -0.23645 2.0237

如果您可以访问 系统标识工具箱, ,您可以使用 Misdata 函数以估计缺失值。根据 文档:

该命令线性地插值缺失值以估计第一个模型。然后,它使用此模型来最大程度地减少从重建数据获得的输出预测错误来估计缺失数据作为参数。

基本上,算法以类似于期望最大化(EM)算法的方式在估计丢失的数据和估计模型之间进行交替。

估计的模型可以是任何线性模型 idmodel (ar/arx/..),或者如果未给出,则使用默认订单状态空间模型。

这是将其应用于您的数据的方法:

for i=1:numel(seq)
    dat = misdata( iddata(seq{i}(:)) );
    seq{i} = dat.OutputData;
end

利用 格里德插座

还有其他一些功能,例如Interp1。对于弯曲图,样条是查找缺失数据的最佳方法。

正如Judowill所说,您需要在数据之间假设某种关系。

一个微不足道的选择是计算总序列的平均值,并将其用于丢失数据。另一个微不足道的选项是采用上一个和n个下一个值的平均值。

但是请非常谨慎:如果您缺少数据,那么处理那些缺少数据的数据通常比弥补一些可以搞砸您的分析的虚假数据更好。

考虑以下示例

x =一些nx1数组y = f(x),其中一些nan

然后使用

x1 = x(find(〜isnan(y))); y1 = y(find(〜isnan(y)));

现在,插入X1和Y1以计算所有X。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top