MATLAB: durch interpolation zu ersetzen fehlender Werte (NaN)
Habe ich cell-array, die jeweils eine Sequenz von Werten als einen zeilenvektor. Die Sequenzen enthalten einige fehlende Werte vertreten durch NaN
.
Möchte ich alle ersetzen, NaNs über irgendeine Art von interpolation, wie kann ich dies in MATLAB? Ich bin auch offen für andere Vorschläge, wie der Umgang mit diesen fehlenden Werten.
Betrachten Sie dieses Beispiel Daten, 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
Edit:
Basiert auf den Antworten, ich denke, es ist schon eine Verwirrung: offensichtlich bin ich nicht die Arbeit mit zufälligen Daten, der code oben ist lediglich ein Beispiel, wie die Daten strukturiert sind.
Den eigentlichen Daten ist eine gewisse form der verarbeiteten Signale. Das problem ist, dass während der Analyse, meine Lösung würde fehlschlagen, wenn die Sequenzen enthalten fehlende Werte, daher die Notwendigkeit für Filterung und interpolation (die ich bereits als mit den Mittelwerten der einzelnen Sequenz, um zu füllen die Lücken, aber ich bin der Hoffnung, für etwas stärker)
- In deinem Beispiel denke ich, Sie würden sein hart gedrückt, um einen Weg finden, um die fehlenden Werte interpolieren. Interpolation setzt Voraus, dass es irgendeine Art von Beziehungen zwischen den Daten-Punkten. Oft kann dies sein, dass Sie aus einer Zeit stammen-Serie (also eine gute Vermutung ist, dass der fehlende Teil kann abgeleitet werden von dem nahegelegenen Punkte). In deinem Beispiel Daten, die Sie versuchen zu erraten, ein "coin-flip" nur auf der Grundlage von anderen coin-flips. Wenn Sie können, geben Sie uns mehr Informationen über Ihre spezifischen Beispiel können wir helfen mehr.
- Ich glaube, er war nur mit random-Daten als ein Beispiel für die Menschen, um mit zu spielen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wenn Sie arbeiten mit Zeitreihen-Daten, dann können Sie mit Hilfe von Matlab built-in-interpolation-Funktion.
Etwas wie dies funktionieren sollte, die für Ihre situation, aber Sie brauchen, um maßgeschneiderte es ein wenig ... dh. wenn Sie nicht gleich spaced sampling müssen Sie ändern Sie die
times
Linie.Müssen Sie spielen, um mit den Optionen von
interp1
um herauszufinden, welche am besten für Ihre situation.times
Vektor, weil die Werte werden aufgezeichnet, auf eine 3-Sekunden-basisIch würde inpaint_nans, ein tool zu ersetzen, der nan Elemente in der 1-d oder 2-d Matrizen durch lineare interpolation.
Wenn Sie Zugriff auf die System Identification Toolbox, können Sie die MISDATA Funktion zur Schätzung der fehlenden Werte. Nach der Dokumentation:
Grundsätzlich ist der Algorithmus wechselt zwischen Schätzung fehlender Daten und die Schätzung von Modellen, in ähnlicher Weise, wie der Expectation-Maximization (EM) Algorithmus.
Modell geschätzt werden kann, beliebigen linearen Modelle
idmodel
(AR - /ARX/..), oder falls nicht angegeben, verwendet eine Standard-Bestellung state-space-Modell.Hier ist, wie Sie für Ihre Daten:
Verwenden griddedInterpolant
Gibt es auch einige andere Funktionen wie interp1. Für gekrümmte Grundstücke spline ist das die beste Methode zu finden, die fehlenden Daten.
Als JudoWill sagt, müssen Sie davon ausgehen, irgendeine Art von Beziehung zwischen Ihren Daten.
Eine triviale Möglichkeit wäre, berechnen Sie den Mittelwert der gesamten Reihe, und verwenden Sie diese für fehlende Daten. Eine andere triviale Möglichkeit wäre, nehmen Sie den Mittelwert der n vorhergehenden und n nächsten Werte.
Aber sehr vorsichtig sein mit diesem: wenn Sie die fehlenden Daten, Sie sind in der Regel besser zu tun mit den fehlenden Daten, als einige gefälschte Daten, vermasseln könnte Ihre Analyse.
Betrachten Sie das folgende Beispiel
X=einige Nx1-array
Y=F(X), mit ein paar NaNs in es
dann verwenden
X1=X(find(~isnan(Y)));
Y1=Y(find(~isnan(Y)));
Nun interpolieren über X1 und Y1 zu berechnen, werden alle Werte auf allen X.