7
votes

MATLAB: Utilisation d'une interpolation pour remplacer les valeurs manquantes (NAN)

J'ai une matrice de cellule chacune contenant une séquence de valeurs en tant que vecteur de ligne. Les séquences contiennent des valeurs manquantes représentées par nan code>.

Je voudrais remplacer toutes les nans en utilisant une sorte de méthode d'interpolation, comment puis-je peut-être le faire dans matlab? Je suis également ouvert à d'autres suggestions sur la manière de traiter ces valeurs manquantes. P>

Considérez cette exemple de données pour illustrer le problème: P>

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


2 commentaires

Dans votre exemple, je pense que vous seriez pressé de trouver un moyen d'interpoler les valeurs manquantes. L'interpolation exige qu'il existe une sorte de relation entre les points de données. Souvent, cela peut être qu'ils viennent d'une série temporelle (de sorte que la partie manquante puisse être déduite des points voisins). Dans votre exemple de données, vous essayez de deviner une "pièce à bascule" basée uniquement sur d'autres coups de pièces. Si vous pouvez nous donner plus d'informations sur votre exemple spécifique, nous pouvons vous aider davantage.


@Judowill: Je pense qu'il utilisait simplement des données aléatoires comme exemple pour que les gens puissent jouer.


6 Réponses :


0
votes

Comme le dit Jackowill, vous devez assumer une sorte de relation entre vos données.

Une option triviale serait de calculer la moyenne de votre série totale et d'utiliser celles des données manquantes. Une autre option triviale serait de prendre la moyenne des n précédentes et des valeurs suivantes.

Mais soyez très prudent avec ceci: si vous manquez des données, vous préférez gérer ces données manquantes que de constituer de fausses données qui pourraient bousiller votre analyse.


0 commentaires

8
votes

Eh bien, si vous travaillez avec des données de la série temporelle, vous pouvez utiliser la fonction d'interpolation intégrée de Matlab.

Quelque chose comme ça devrait fonctionner pour votre situation, mais vous devrez l'adapter un peu ... c'est à dire. Si vous n'avez pas d'échantillonnage égal espacé, vous devez modifier la ligne fois . xxx

Vous devez jouer avec le options de interpolle pour déterminer lesquelles fonctionnent le mieux pour votre situation.


3 commentaires

Merci, dans mon cas, je dois modifier le vecteur car les valeurs sont enregistrées sur une base de 3 secondes


... Maintenant que j'y pense, cela n'a pas d'importance tant que les séquences sont échantillonnées de manière égale, n'est-ce pas?


Ouais, tant qu'ils sont également échantillonnés, cela n'a pas vraiment d'importance ... mais j'essaie d'être aussi explicite que possible.



2
votes

Si vous avez accès à la boîte à outils EM>, vous pouvez utiliser MISDATA fonction pour estimer les valeurs manquantes. Selon le Documentation :

Cette commande interpolate de manière linéaire valeurs manquantes pour estimer le premier maquette. Ensuite, il utilise ce modèle pour estimer les données manquantes comme Paramètres en minimisant la sortie Erreurs de prédiction obtenues à partir du Données reconstruites. P> blockQuote>

Fondamentalement, l'algorithme alterne entre estimation des données manquantes et estimer des modèles, d'une manière similaire à l'algorithme d'optimisation des attentes (EM). p>

Le modèle estimé peut être n'importe lequel des modèles linéaires IDModel code> (ar / arx / ..), ou si non donné, utilise un modèle d'espace d'état de commande par défaut. p>

Voici comment l'appliquer à vos données: P >

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


0 commentaires

8
votes

J'utiliserais Inpaint_nans , un outil conçu pour remplacer les éléments NAN en 1-D ou matrices 2-D par 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


0 commentaires

0
votes

considérer l'exemple suivant

x = un tableau NX1 Y = f (x) avec des nans dedans

Ensuite, utilisez

x1 = x (trouver (~ isnan (y))); Y1 = y (trouver (~ isnan (y)));

Interpoler maintenant sur X1 et Y1 pour calculer toutes les valeurs du tout X.


0 commentaires

1
votes

Utilisez GriddeddePLant

Il y a aussi d'autres fonctions telles que Interp1. Pour les parcelles courbes Spline est la meilleure méthode pour trouver des données manquantes.


3 commentaires

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses uniquement uniquement peuvent devenir invalides si la page liée change. - de l'avis


@Michel Ce n'est pas une réponse uniquement sur le lien. La réponse est le nom de la fonction à utiliser - le lien n'est qu'un lien vers la documentation de cette fonction.


@JWG Votre question est dans une analyse de mauvaise qualité. Vous voudrez peut-être partager comment one utiliserait cette fonction, pas seulement le nom de la fonction et un lien.