【问题标题】:about grubbs test for outlier detection in R关于 R 中异常值检测的 grubbs 测试
【发布时间】:2026-02-01 20:40:01
【问题描述】:

我按照How to repeat the Grubbs test and flag the outliers网站上的程序代码,在我的数据向量中测试了异常值。我的数据向量包含更多 44000 项。

输出如下:

grubbs.result = grubbs.test(test_data)

pvalue = grubbs.result$p.value

grubbs.result

Grubbs test for one outlier
data:  test_data
G = 3.79551464153584561, U = 0.99967764032789053, p-value = 1
alternative hypothesis: highest value -48.70000076 is an outlier

pvalue

[1] 1

grubbs.result$alternative

[1] "highest value -48.70000076 is an outlier"

我的问题是为什么pvalue是1,但是程序检测到值-48.70000076是异常值??? -48.70000076 是否是 grubbs 测试检测到的异常值?如果是,如何解释pvalue是1,而不是0.01这样的小值?

因为我是这个领域的新手,有人可以帮我吗?非常感谢您。

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    这更像是CV 的问题,但我会快速上一堂统计课。寻找异常值时要知道的最重要的事情是,除非您有一个有效的、非统计的原因,否则无论与其他数据有多大不同,任何数据点都不是真正的异常值。这些极端数据点是您数据的一部分——它们属于。

    有些数据确实是异常值,但这并不是因为 Grubb 的测试表明如此。例如,如果您正在测量人们的体温,并且有人将他的温度计放在灯泡旁边,那么他们的温度可能会被认为是异常值。如果其他人只是喝了一杯冷水,而且是口测,他们也可以被认为是异常值。但是,如果某人的体温与刚喝了一杯冷水的人的体温相同,那不一定是异常值。仅出于统计原因,我们不会说某事是异常值。

    抛开免责声明,我们可以在这里解决核心问题,它是统计数据。该测试说明了替代假设是什么,即最极端的数据点是异常值。在这种情况下,“-48.70000076”恰好比任何其他数据点更远离其他数据点,因此我们的零假设是没有数据点是异常值——包括那个最极端的点。如果我们拒绝原假设,我们将得出结论的替代假设是,至少最极端的点是异常值(统计上)。

    在这种情况下,p 值表明您没有任何证据表明您的任何数据都是异常值,因为 p 值为 1:

    set.seed(123)
    test0 <- runif(1000) 
    test_data <- test0-max(test0)-48.70000076
    grubbs.test(test_data)
    
    #     Grubbs test for one outlier
    
    # data:  test_data
    # G = 1.74660, U = 0.99694, p-value = 1
    # alternative hypothesis: highest value -48.70000076 is an outlier
    

    【讨论】: