Matlab, игнорируя NaN в матрице - PullRequest
3 голосов
/ 28 июня 2011

У меня есть матрица (X) двойников, содержащая временные ряды.Некоторые из наблюдений устанавливаются на NaN, когда отсутствует значение.Я хочу рассчитать стандартное отклонение для каждого столбца, чтобы получить значение стандартного отклонения для каждого столбца.Так как у меня смешаны NaN, простой std(X) не будет работать, и если я попытаюсь std(X(~isnan(X)), я получу стандартное отклонение для всей матрицы вместо одного на столбец.

Есть ли способпросто опустить NaN в вычислениях std dev по 1-му диму, не прибегая к циклу?

Обратите внимание, что я хочу игнорировать только отдельные значения, а не целые строки или столбцы в случае NaN.Очевидно, что я не могу установить NaN на ноль или любое другое значение, так как это повлияет на вычисления.

1 Ответ

2 голосов
/ 28 июня 2011

Посмотрите на nanstd (набор инструментов статистики).

Идея состоит в том, чтобы центрировать данные, используя nanmean, затем заменить NaN нулем и, наконец, вычислить стандартное отклонение.

См. nanmean ниже.

  % maximum admissible fraction of missing values
  max_miss = 0.6;  

  [m,n]   = size(x);

  % replace NaNs with zeros.
  inan    = find(isnan(x));
  x(inan) = zeros(size(inan));

  % determine number of available observations on each variable
  [i,j]   = ind2sub([m,n], inan);     % subscripts of missing entries
  nans    = sparse(i,j,1,m,n);        % indicator matrix for missing values
  nobs    = m - sum(nans);

  % set nobs to NaN when there are too few entries to form robust average
  minobs  = m * (1 - max_miss);
  k       = find(nobs < minobs);
  nobs(k) = NaN;

  mx      = sum(x) ./ nobs;

См. nanstd ниже.

  flag = 1; % default: normalize by nobs-1

  % center data
  xc      = x - repmat(mx, m, 1);

  % replace NaNs with zeros in centered data matrix
  xc(inan) = zeros(size(inan));

  % standard deviation
  sx      = sqrt(sum(conj(xc).*xc) ./ (nobs-flag));
...