使用R识别数据集中的异常读数

时间:2014-05-06 01:46:09

标签: r if-statement

我有一个带有一串值的数据框,我想要识别某些异常读数。我想在我的数据框中创建第三列,将某些读数标记为“异常”,其余为“正常”。查看我的数据图,当我得到这些奇怪的下降时,通过眼睛看起来非常明显,但我无法弄清楚如何让R识别奇数读数,因为基线平均值随时间变化。我能想出的最好的东西是用来将某些东西归类为“异常”的三条规则。

1:从第二个值开始,如果第二个值在第一个值的近距离范围内,则在第三列中标记为“N”表示正常。依此类推其他数据集。

2:如果第二个值表示从第一个值开始大幅增加或减少,则在第三列中将异常标记为“A”。

3:如果某个值标记为“A”,如果它在前一个异常值的小范围内,则以下值也将标记为“A”。如果以下值表示从先前的异常值开始大幅增加或减少,则将其标记为“N”。

这是我能提出的最好的逻辑,但是如果你能想出更好的主意,那么看下面的数据就是我的全部。

给定一个虚拟数据集:

SampleNum<-1:50
Value <- c(1, 2, 2, 2, 23, 22, 2, 3, 2, -23, -23, 4, 4, 5, 5, 25, 24,
           6, 7, 6, 35, 38, 20, 21, 22, -22, 2, 2, 6, 7, 7, 6, 30, 31, 
           6, 6, 6, 5, 22, 22, 4, 5, 4, 5, 30, 39, 18, 18, 19, 18)

DF<-data.frame(SampleNum,Value)

这是我可能会看到最终数据的方式,第三列标识哪些值是异常的。

SampleNum Value Name
     1     1    N
     2     2    N
     3     2    N    
     4     2    N
     5    23    A
     6    22    A
     7     2    N
     8     3    N
     9     2    N
    10   -23    A
    11   -23    A
    12     4    N
    13     4    N
    14     5    N
    15     5    N
    16    25    A
    17    24    A
    18     6    N
    19     7    N
    20     6    N
    21    35    A
    22    38    A
    23    20    N
    24    21    N
    25    22    N
    26   -22    A
    27     2    N
    28     2    N
    29     6    N
    30     7    N
    31     7    N
    32     6    N
    33    30    A
    34    31    A
    35     6    N
    36     6    N
    37     6    N
    38     5    N
    39    22    A
    40    22    A
    41     4    N
    42     5    N
    43     4    N
    44     5    N
    45    30    A
    46    39    A
    47    18    N
    48    18    N
    49    19    N
    50    18    N

1 个答案:

答案 0 :(得分:1)

您需要将异常与不同分布的混合物区分开来。这通常不是一个统计问题,而是来自特定领域知识的东西。如果您根据您的数据绘制了desnity估计值:

png(); plot( density(DF$Value)) ; dev.off()

enter image description here

那么我们怎么知道零下的两个值不是真的呢?它们是样本的4%,因此应用规则:&#34;异常==项目超出99%置信区间&#34;不会将它们定义为&#34;异常。这些活动测量是否在某种情况下 应该给出正值?根据任何合理的定义,在20处达到更大的凸起肯定不是异常。

你应该对统计控制的主题进行一些搜索。 R包中有SPC导向功能。