3 votes

Matlab en ignorant les NaN dans la matrice

J'ai une matrice (X) de doubles contenant des séries temporelles. Certaines des observations sont définies sur NaN lorsqu'il y a une valeur manquante. Je veux calculer l'écart type par colonne pour obtenir une valeur d'écart type pour chaque colonne. Comme j'ai des NaN mélangés, un simple std(X) ne fonctionnera pas et si j'essaie std(X(~isnan(X)) je finis par obtenir l'écart type pour l'ensemble de la matrice, au lieu de un par colonne.

Y a-t-il un moyen d'omettre simplement les NaNs des calculs d'écart type le long de la 1ère dimension sans recourir à une boucle?

Veuillez noter que je veux seulement ignorer les valeurs individuelles et non pas des lignes ou des colonnes entières en cas de NaN. Évidemment, je ne peux pas définir les NaN à zéro ou à une autre valeur car cela aurait un impact sur les calculs.

2voto

Wok Points 2020

Jetez un œil à nanstd (boîte à outils statistique).

L'idée est de centrer les données en utilisant nanmean, puis de remplacer NaN par zéro, et enfin de calculer l'écart type.

Voir nanmean ci-dessous.

  % fraction maximale admissible de valeurs manquantes
  max_miss = 0.6;  

  [m,n]   = size(x);

  % remplacer les NaN par des zéros.
  inan    = find(isnan(x));
  x(inan) = zeros(size(inan));

  % déterminer le nombre d'observations disponibles sur chaque variable
  [i,j]   = ind2sub([m,n], inan);     % sous-indices des entrées manquantes
  nans    = sparse(i,j,1,m,n);        % matrice indicatrice des valeurs manquantes
  nobs    = m - sum(nans);

  % définir nobs sur NaN lorsqu'il y a trop peu d'entrées pour former une moyenne robuste
  minobs  = m * (1 - max_miss);
  k       = find(nobs < minobs);
  nobs(k) = NaN;

  mx      = sum(x) ./ nobs;

Voir nanstd ci-dessous.

  flag = 1; % par défaut: normaliser par nobs-1

  % centrer les données
  xc      = x - repmat(mx, m, 1);

  % remplacer les NaN par des zéros dans la matrice de données centrées
  xc(inan) = zeros(size(inan));

  % écart type
  sx      = sqrt(sum(conj(xc).*xc) ./ (nobs-flag));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X