-->

z值与在MATLAB NaN值(矢量)(z score with nan values in mat

2019-09-18 03:00发布

我试图计算zscore为5000行的载体,它有许多NaN值。 我计算过很多次,所以我不想使用一个循环,我希望能找到一个解决方案矢量。

循环解决方案:

for i = 1:end
   vec(i,1) = (val(i,1) - nanmean(:,1))/nanstd(:,1)
end

部分矢量溶液:

zscore(vec(find(isnan(vec(1:end) == 0))))

但是这将返回一个向量的原始矢量减去NaN值的长度。 因此,它是不一样的原始大小。

我想计算的zscore为载体,进行插值话后丢失的数据。 我必须做的时候,这100S因此,我要寻找一个快速的量化方法。

Answer 1:

这是一个矢量化的解决方案:

%生成与一些示例性数据NaN秒。

val = reshape(magic(4), 16, 1);
val(10) = NaN;
val(17) = NaN;

下面的代码:

valWithoutNaNs = val(~isnan(val));
valMean = mean(valWithoutNaNs);
valSD = std(valWithoutNaNs);
valZscore = (val-valMean)/valSD;

然后列向量valZscore包含偏差(Z值),并且具有NaN对值NaN在值val ,原始测量数据。



Answer 2:

对不起这个答案为6月中下旬,但对于其他人谁遇到这个线程:

接受的答案是不完全矢量化,它没有做真正的什么zscore确实如此美妙:也就是说,做zscores沿着矩阵的特定维度。

如果你想在一次计算的大量矢量的zscores,作为OP说,他是干什么的,最好的解决办法是这样的:

Z = bsxfun(@divide, bsxfun(@minus, X, nanmean(X)) , 
                   nanstd(X) );

要做到这一点上的任意尺寸,只是把里面的尺寸nanmeannanstd ,并bsxfun负责剩下的照顾。

nanzscore = @(X,DIM) bsxfun(@divide, bsxfun(@minus, X, nanmean(X,DIM)), ...
                                     nanstd(X,DIM));


Answer 3:

匿名函数:

nanZ = @(xIn)(xIn-nanmean(xIn))/nanstd(xIn);

nanZ(vectorWithNans)



Answer 4:

以下匿名函数矢量版本(假设观测行,列变量):

nanZ = @(xIn)(xIn-repmat(nanmean(xIn),size(xIn,1),1))./repmat(nanstd(xIn),size(xIn,1),1);
nanZ(matrixWithNans)


文章来源: z score with nan values in matlab (vectorized)