【问题标题】:Matlab disregarding NaN's in matrixMatlab忽略矩阵中的NaN
【发布时间】:2011-09-24 02:54:09
【问题描述】:

我有一个包含时间序列的双精度矩阵 (X)。当存在缺失值时,一些观察值设置为NaN。我想计算每列的标准偏差以获得每列的标准偏差值。由于我混入了 NaN,因此简单的 std(X) 将不起作用,如果我尝试 std(X(~isnan(X)),我最终会得到整个矩阵的 std dev,而不是每列一个。

有没有一种方法可以在不使用循环的情况下从标准开发计算中简单地忽略 NaN?

请注意,在 NaN 的情况下,我只想忽略单个值,而不是整个行或列。显然我不能将 NaN 设置为零或任何其他值,因为这会影响计算。

【问题讨论】:

    标签: matlab matrix nan


    【解决方案1】:

    看看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));
    

    【讨论】:

    • 太好了,谢谢。不敢相信我错过了那个功能。当您浏览 std 的帮助时,希望 Matlab 链接到 nanstd :-)。再次感谢一百万。
    猜你喜欢
    • 2012-12-20
    • 2012-04-03
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2018-07-05
    • 2018-03-06
    相关资源
    最近更新 更多