2011-06-28 419 views
3

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

有没有一种方法可以简单地省略沿着第一个昏暗的std dev计算的NaN而不诉诸循环?

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

回答

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)); 
+0

太好了,谢谢。不能相信我错过了这个功能。本来希望当您浏览标准:-)的帮助时,将Matlab链接到nanstd。再次感谢一百万。 – hgus1294

+0

不客气。 – Wok