7

我有一个单元数组,每个数组都包含一系列值作为行向量。序列包含一些由 表示的缺失值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

编辑:

根据回复,我认为存在混淆:显然我不是在使用随机数据,上面显示的代码只是数据结构的一个示例。

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

4

6 回答 6

8

好吧,如果您正在处理时间序列数据,那么您可以使用 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来确定哪些选项最适合您的情况。

于 2010-09-02T18:23:45.383 回答
8

我会使用inpaint_nans,这是一种旨在通过插值替换一维或二维矩阵中的 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
于 2010-09-02T23:24:29.490 回答
2

如果您有权访问System Identification Toolbox,则可以使用MISDATA函数来估计缺失值。根据文档

此命令线性插值缺失值以估计第一个模型。然后,它使用该模型通过最小化从重建数据中获得的输出预测误差来估计缺失数据作为参数。

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

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

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

for i=1:numel(seq)
    dat = misdata( iddata(seq{i}(:)) );
    seq{i} = dat.OutputData;
end
于 2010-09-02T20:33:16.670 回答
1

使用griddedInterpolant

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

于 2017-09-05T00:17:31.873 回答
0

考虑以下示例

X=some Nx1 array Y=F(X) with some NaNs in it

然后使用

X1=X(查找(~isnan(Y))); Y1=Y(查找(~isnan(Y)));

现在对 X1 和 Y1 进行插值以计算所有 X 处的所有值。

于 2013-06-21T15:49:04.230 回答
0

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

一个简单的选择是计算整个系列的平均值,并将其用于缺失数据。另一个简单的选择是取 n 个前一个值和 n 个下一个值的平均值。

但是要非常小心:如果您丢失了数据,通常最好处理这些丢失的数据,而不是编造一些可能会破坏您的分析的虚假数据。

于 2010-09-02T17:19:51.957 回答