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

1次元または2次元の行列のnan要素を補間によって置き換えるように設計されたツールであるinpaint_nansを使用します。

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 に答える
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 に答える
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

JudoWillが言うように、データ間に何らかの関係があると想定する必要があります。

簡単なオプションの1つは、系列全体の平均を計算し、それらを欠測データに使用することです。もう1つの簡単なオプションは、前のn個と次のn個の値の平均を取ることです。

ただし、これには十分注意してください。データが欠落している場合は、分析を台無しにする可能性のある偽のデータを作成するよりも、一般に、欠落しているデータを処理する方が適切です。

于 2010-09-02T17:19:51.957 に答える
0

次の例を考えてみましょう

X=いくつかのNx1配列Y=F(X)といくつかのNaN

次に使用します

X1 = X(find(〜isnan(Y))); Y1 = Y(find(〜isnan(Y)));

次に、X1とY1を補間して、すべてのXですべての値を計算します。

于 2013-06-21T15:49:04.230 に答える