Matlab无视NaN';矩阵中的s
我有一个包含时间序列的双倍矩阵(Matlab无视NaN';矩阵中的s,matlab,matrix,nan,Matlab,Matrix,Nan,我有一个包含时间序列的双倍矩阵(X)。当缺少值时,某些观测值被设置为NaN。我想计算每列的标准偏差,以获得每列的std dev值。由于我混合了NAN,一个简单的std(X)将不起作用,如果我尝试std(X(~isnan(X))我最终会得到整个矩阵的std-dev,而不是每列一个 有没有一种方法可以简单地从沿第一个dim的std-dev计算中忽略NAN,而不用循环 请注意,对于NaN,我只想忽略单个值,而不是整行或整列。显然,我不能将NaN设置为零或任何其他值,因为这会影响计算。请查看(统计工具箱
X
)。当缺少值时,某些观测值被设置为NaN
。我想计算每列的标准偏差,以获得每列的std dev值。由于我混合了NAN,一个简单的std(X)
将不起作用,如果我尝试std(X(~isnan(X))
我最终会得到整个矩阵的std-dev,而不是每列一个
有没有一种方法可以简单地从沿第一个dim的std-dev计算中忽略NAN,而不用循环
请注意,对于NaN,我只想忽略单个值,而不是整行或整列。显然,我不能将NaN设置为零或任何其他值,因为这会影响计算。请查看(统计工具箱)
其思想是使用数据中心,然后用零替换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;
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。再次感谢你。