Matlab在矩阵中忽略NaN值。

3
我有一个包含时间序列的双精度矩阵(X)。当存在缺失值时,部分观测值会被设置为NaN。我想计算每列的标准差,以获得每列的标准偏差值。由于有NaN混合在其中,简单的std(X)将无法工作,如果我尝试std(X(~isnan(X)),我最终会得到整个矩阵的标准偏差,而不是每个列的标准偏差。
是否有一种简单的方法可以省略沿着第一维的标准偏差计算中的NaN,而不必使用循环?
请注意,我只想忽略单个值,而不是整个行或列中的NaN。显然,我不能将NaN设置为零或任何其他值,因为那样会影响计算。
1个回答

2
请查看 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));

太好了,谢谢。真不敢相信我错过了那个函数。希望Matlab在浏览std的帮助时链接到nanstd :-)。再次感谢你。 - hgus1294

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接