Frage

Ich habe Zellarray, das jeweils eine Sequenz von Werten als Zeilenvektor enthält. Die Sequenzen enthalten einige fehlende Werte, die von dargestellt werden NaN.

Ich möchte alle NANS mit einer Art Interpolationsmethode ersetzen. Wie kann ich dies in Matlab tun? Ich bin auch offen für andere Vorschläge, wie man mit diesen fehlenden Werten umgeht.

Betrachten Sie diese Beispieldaten, um das Problem zu veranschaulichen:

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

Die resultierenden Sequenzen:

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

Bearbeiten:

Basierend auf den Antworten denke ich, dass es eine Verwirrung gegeben hat: Offensichtlich arbeite ich nicht mit zufälligen Daten. Der oben gezeigte Code ist einfach ein Beispiel dafür, wie die Daten strukturiert sind.

Die tatsächlichen Daten sind eine Form von verarbeiteten Signalen. Das Problem ist, dass meine Lösung während der Analyse fehlschlägt, wenn die Sequenzen fehlende Werte enthalten, weshalb die Notwendigkeit einer Filterung/Interpolation erforderlich ist (ich habe bereits überlegt, den Mittelwert jeder Sequenz zu füllen, um die Lücken zu füllen, aber ich hoffe auf etwas leistungsfähigeres).

War es hilfreich?

Lösung

Wenn Sie mit Zeitreihen Daten arbeiten, können Sie die integrierte Interpolationsfunktion von MATLAB verwenden.

So etwas sollte für Ihre Situation funktionieren, aber Sie müssen es ein wenig anpassen ... dh. Wenn Sie keine gleiche Abtastung haben, müssen Sie die ändern times Linie.

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

Sie müssen mit den Optionen von spielen interp1 Um herauszufinden, welche für Ihre Situation am besten geeignet sind.

Andere Tipps

ich würde ... benutzen Inpaint_nans, ein Werkzeug zum Ersetzen von NAN-Elementen in 1-D- oder 2-D-Matrizen durch Interpolation.

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

Wenn Sie Zugriff auf die Systemidentifikations -Toolbox, du kannst den ... benutzen Fehldata Funktion, um fehlende Werte abzuschätzen. Laut dem Dokumentation:

Dieser Befehl interpoliert fehlende Werte, um das erste Modell abzuschätzen. Anschließend wird dieses Modell verwendet, um die fehlenden Daten als Parameter zu schätzen, indem die Ausgangsvorhersagefehler minimiert werden, die aus den rekonstruierten Daten erhalten wurden.

Grundsätzlich wechselt der Algorithmus zwischen der Schätzung fehlender Daten und der Schätzmodelle auf ähnliche Weise wie der Algorithmus zur Erwartungsmaximierung (EM).

Das geschätzte Modell kann eines der linearen Modelle sein idmodel (AR/ARX/..) oder wenn nicht angegeben, verwendet ein Status-State-Space-Modell Standardeintritt.

Hier erfahren Sie, wie Sie es auf Ihre Daten anwenden können:

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

Verwenden GriddedInterpolant

Es gibt auch einige andere Funktionen wie Interp1. Für gebogene Diagramme ist Spline die beste Methode, um fehlende Daten zu finden.

Wie Judowill sagt, müssen Sie eine Art Beziehung zwischen Ihren Daten annehmen.

Eine triviale Option wäre die Berechnung des Mittelwerts Ihrer gesamten Serie und die Verwendung dieser für fehlende Daten. Eine weitere triviale Option wäre, den Mittelwert des n vorherigen und n nächsten Werte zu nutzen.

Seien Sie jedoch sehr vorsichtig damit: Wenn Sie Daten fehlen, können Sie im Allgemeinen besser mit diesen fehlenden Daten umgehen, als einige gefälschte Daten zu erstellen, die Ihre Analyse vermasseln könnten.

Betrachten Sie das folgende Beispiel

X = ein nx1 Array y = f (x) mit einigen Nans darin

dann benutze

X1 = x (find (~ isnan (y))); Y1 = y (find (~ isnan (y)));

Interpolieren Sie nun über X1 und Y1, um alle Werte auf allen X zu berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top