2011-06-28 207 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