質問

それぞれの値のシーケンスを行ベクトルとして含む cell 配列があります。シーケンスには、次のように表されるいくつかの欠損値が含まれています。 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または2Dマトリックスの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

にアクセスできる場合 システム識別ツールボックス, 、使用できます 誤用 欠損値を推定する機能。による ドキュメンテーション:

このコマンドは、欠損値を直線的に補間して最初のモデルを推定します。次に、このモデルを使用して、再構築されたデータから取得した出力予測エラーを最小化することにより、欠落データをパラメーターとして推定します。

基本的に、アルゴリズムは、予想最大化(EM)アルゴリズムと同様の方法で、欠損データの推定と推定モデルとの間に交互になります。

推定されるモデルは、線形モデルのいずれかになる可能性があります idmodel (ar/arx/..)、または与えられていない場合は、デフォルトのオーダー状態空間モデルを使用します。

データに適用する方法は次のとおりです。

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

使用する GriddedInterpolant

Interp1のような他の機能もいくつかあります。湾曲したプロットの場合、スプラインは欠落データを見つけるための最良の方法です。

ムダウィルが言うように、あなたはあなたのデータ間の何らかの関係を想定する必要があります。

些細なオプションの1つは、合計シリーズの平均を計算し、欠落データに使用することです。別の些細なオプションは、以前のnの平均とn次の値を取ることです。

ただし、これには非常に注意してください。データが欠落している場合は、一般的に、分析を台無しにする可能性のある偽データを作成するよりも、これらの欠落データに対処する方が良いでしょう。

次の例を考えてください

x =いくつかのnx1配列y = f(x)nansが含まれています

次に、使用します

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

現在、x1とy1を超えて補間して、すべての値をすべてxで計算します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top