在MATLAB中用NaN替换异常值

时间:2016-03-10 12:25:47

标签: matlab nan outliers

我有一个n×m数据矩阵,每个样本有n个样本和m个测量值。我正在处理来自质谱的数据,测量不同代谢物的浓度。每列是单一代谢物的浓度。行是样本。一些样品的代谢物测量值远低于其余样品。

我想找到这些异常值,并用NaN替换它们。有没有办法自动执行此操作,可能是通过查找高于X列SD的值并使其成为NaN?我找到了R和Python的相关问题,但没有找到MATLAB。

附录:dfri的解决方案对我来说非常合适。但是,我无法使用列SD作为截止测量,因为异常值使得SD非常大,以至于异常值仍然在阈值内(它们比其余值大10 000倍)。我最终使用100 x列中位数作为删除阈值。

1 个答案:

答案 0 :(得分:4)

您可以比较数据中的元素以获取某些阈值以识别异常值,并使用结果索引将异常值替换为NaN。 E.g。

data = randi(4,5); %// values in {1, 2, 3, 4}
threshold = 3;     %// decide upon your threshold
data(data > threshold) = NaN

data =

   NaN     3   NaN     2     2
     3     1     3     2     2
     2     2     2   NaN     3
     3     1   NaN   NaN     3
     1     1     1     1   NaN

如果你想更换异常值w.r.t.每列一些阈值列,您可以使用例如bsxfun(谢谢@Dan):

data = randi(4,5) %// values in {1, 2, 3, 4}
threshold = mean(data)+1*std(data) %// per column
data(bsxfun(@(x, y) x > y, data, threshold)) = NaN

%// example:

threshold =

    4.7416    3.7416    4.0000    2.8954    1.9477

data =

     4     3     2   NaN   NaN
     4   NaN     3     1     1
     1     3     4     1   NaN
     4     1     4     1     1
     4     1     2   NaN     1

请注意,正如@Dan在上面的评论中所提到的,您案例中最重要的(非matlab技术)部分是决定如何为每个列创建阈值。上面示例中的简单阈值仅用于显示如何在给定列的阈值数组的情况下“移除”异常值(设置为NaN)的技术方面。