2011-06-28 11 views
3

私は時系列を含むdouble型の行列(X)を持っています。一部の観測値は、値がない場合にはNaNに設定されています。私は、各列の標準偏差を計算して各列の標準偏差値を求めたいと考えています。私はNaNが混在しているので、単純なstd(X)は動作しません。私が試してみると、std(X(~isnan(X))私は列ごとに1つではなく、行列全体に対してstd devを得ることになります。行列のNaNを無視したMatlab

ルーピングに頼らずに1st dimに沿ってstd dev計算からNaNを単純に省略する方法はありますか?

NaNの場合は、行全体または列全体ではなく、個々の値のみを無視したいことに注意してください。明らかに、計算に影響するNaNをゼロまたは他の値に設定することはできません。

答えて

2

nanstd(statツールボックス)をご覧ください。

考え方は、nanmeanを使用してデータを中央に置き、NaNを0に置き換え、最後に標準偏差を計算することです。

下記の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がstd :-)のヘルプを参照するときにnanstdにリンクされることを望んだでしょうか。もう一度、ありがとうございます。 – hgus1294

+0

ようこそ。 – Wok