这两个 Breusch-Pagan 测试有什么区别?

机器算法验证 r 回归 异方差 假设 布鲁施异教徒
2022-02-27 18:24:09

在一些数据上使用 R 并尝试查看我的数据是否是异方差的,我发现了 Breusch-Pagan 测试的两个实现,bptest(包 lmtest)和ncvTest(包 car)。但是,这些会产生不同的结果。两者有什么区别?什么时候应该选择使用其中一种?

> model <- lm(y ~ x)
> bp <- bptest(model)
> bp
studentized Breusch-Pagan test

data:  model 
BP = 3.3596, df = 1, p-value = 0.06681

> ncvTest(model)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 3.858704    Df = 1     p = 0.04948855 

这些示例表明,根据测试,我的数据在一种情况下是异方差的,在另一种情况下是同方差的。我确实在这里找到了这个问题,所以 bptest 可能是学生化的,而 ncvTest 可能不是,但是,这意味着什么?

2个回答

您的猜测是正确的,ncvTest执行原始版本的 Breusch-Pagan 测试。这实际上可以通过比较来验证bptest(model, studentize = FALSE)(正如@Helix123 所指出的,两个函数在其他方面也不同,例如默认参数,一个应该查看包手册以lmtest获取car更多详细信息。)

学生化的 Breusch-Pagan 检验由 R. Koenker 在其 1981 年的文章A Note on Studentizing a Test for Heteroscedasticity中提出。两者最明显的区别是它们使用不同的测试统计量。即,设为学生化测试统计量,为原始统计量,ξξ^

ξ^=λξ,λ=Var(ε2)2Var(ε)2.

这是一段代码,演示了我刚刚编写的内容(数据取自faraway包):

> mdl = lm(final ~ midterm, data = stat500)
> bptest(mdl)

    studentized Breusch-Pagan test

data:  mdl
BP = 0.86813, df = 1, p-value = 0.3515

> bptest(mdl, studentize = FALSE)

    Breusch-Pagan test

data:  mdl
BP = 0.67017, df = 1, p-value = 0.413

> ncvTest(mdl)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 0.6701721    Df = 1     p = 0.4129916 
> 
> n = nrow(stat500)
> e = residuals(mdl)
> bpmdl = lm(e^2 ~ midterm, data = stat500)
> lambda = (n - 1) / n * var(e^2) / (2 * ((n - 1) / n * var(e))^2)
> Studentized_bp = n * summary(bpmdl)$r.squared
> Original_bp = Studentized_bp * lambda
> 
> Studentized_bp
[1] 0.8681335
> Original_bp
[1] 0.6701721

至于为什么要对原始 BP 测试进行学生化,直接引用 R. Koenker 的文章可能会有所帮助:

... 从该分析中得出两个结论:

  1. 分布的峰态极为敏感,并且ε
  2. 测试的渐近大小仅在高斯峰度的特殊情况下是正确的。

前一个结论在 Koenker 和 Bassett (1981) 中得到了扩展,其中提出了异方差性的替代稳健检验。后一个结论意味着 Breusch 和 Pagan 建议的显着性水平只有在 上的高斯条件下才是正确的。由于这些条件通常是盲目假设的,并且众所周知难以验证,因此建议对 Breusch 和 Pagan 检验进行修改,以正确“研究”检验统计量,并为εε

简而言之,学生化的 BP 测试比原始测试更稳健。

实际上,默认情况下使用ncvTest等式的左侧并bptest使用右侧。

这意味着在 的情况下Y ~ X,两个测试将提供相同的结果(关于 的studentize = F选项bptest)。但是在诸如 的多变量分析中Y ~ X1 + X2,结果会有所不同。(正如@Helix123 指出的那样)

来自帮助文件ncvTest : var.formula:“误差方差的单边公式;如果省略,误差方差取决于拟合值。” 这意味着,默认情况下,将使用拟合值,但它也允许使用自变量 (X1 + X2) 的线性组合。

从帮助文件中bptest : varformula:“默认情况下,采用与主回归模型相同的解释变量。”

继续@Francis 的相同示例(数据stat500,来自faraway包):

> mdl_t = lm(final ~ midterm + hw, data = stat500)

BP 检验,使用拟合值:

> ncvTest(mdl_t) # Default

Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 0.6509135    Df = 1     p = 0.4197863 

> bptest(mdl_t, varformula = ~ fitted.values(mdl_t), studentize = F)

Breusch-Pagan test

data:  mdl_t
BP = 0.65091, df = 1, p-value = 0.4198

BP 测试,使用预测变量的线性组合:

> ncvTest(mdl_t, var.formula = ~ midterm + hw)
Non-constant Variance Score Test 
Variance formula: ~ midterm + hw 
Chisquare = 0.7689743    Df = 2     p = 0.6807997 

> bptest(mdl_t, studentize = F) # Default

Breusch-Pagan test

data:  mdl_t
BP = 0.76897, df = 2, p-value = 0.6808

“线性组合选项”允许研究与特定自变量的线性相关性相关的异方差性。例如,只是hw变量:

> ncvTest(mdl_t, var.formula = ~ hw)
Non-constant Variance Score Test 
Variance formula: ~ hw 
Chisquare = 0.04445789    Df = 1     p = 0.833004 

> bptest(mdl_t, varformula = ~ stat500$hw, studentize = F)

Breusch-Pagan test

data:  mdl_t
BP = 0.044458, df = 1, p-value = 0.833

最后,正如@Francis 总结的那样,“简而言之,学生化的 BP 测试比原始测试更稳健”,我通常使用bpteststudentize = TRUE(默认)和varformula = ~ fitted.values(my.lm)选项作为同方差的初始方法。