我有一个n×m数据矩阵,每个样本有n个样本和m个测量值。我在处理质谱的数据,测量不同代谢物的浓度。每一栏都是单一代谢物的浓度。行是样品。有些样品的代谢物测量值远高于其他样品。
我希望找到这些异常值,并用NaN替换它们。是否有一种方法可以自动完成这一任务,也许可以通过查找高于X列SDs的值并使其为NaN?我为R和Python找到了相关的问题,但没有找到MATLAB的相关问题。
增编:dfri的解决方案对我来说非常有效。但是,我不能使用列SD作为截止度量,因为异常值使得SD非常大,以至于异常值仍然在阈值之内(它们比其他值大10 000倍)。最后,我使用了100倍的列中值作为删除的阈值。
发布于 2016-03-10 12:29:37
您可以对数据中的元素进行某些阈值的比较,以确定异常值,并使用结果索引来用NaN替换异常值。例如。
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)的技术方面,为列设置了一系列阈值。
https://stackoverflow.com/questions/35916464
复制相似问题