MATLAB: Verwenden der Interpolation, um fehlende Werte zu ersetzen (NAN)
-
26-09-2019 - |
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).
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.