为什么 Breusch-Pagan 检验对设计为非异方差的模拟数据显着?

机器算法验证 r 异方差
2022-03-29 04:15:10

我正在使用Breusch-Pagan检验测试线性回归的残差以检测异方差性。

这是残差图: 残差

这是R代码:

> library(lmtest)
> 
> mod <- lm(rnorm(1000)~1)
> 
> bptest(mod)

    studentized Breusch-Pagan test

data:  mod 
BP = 0, df = 0, p-value < 2.2e-16

有人能告诉我为什么它拒绝同方差错误的零假设吗?

情节看起来并不异方差。

编辑:

但是该图是一个示例,我有两个价格列表(priceApriceB),我需要检查这两个列表的线性回归生成的残差是否: lm(priceA ~ priceB + 0) 我需要零截距是 homecedastic或不。有人可以给我一个小例子吗?每个价目表的长度为 750。

编辑:

我也得到:

BP = 67.4362,df = 1,p 值 < 2.2e-16

有了这张图表 新图表

它是同性恋吗?我已经绘制了残差。

@Wolfgang,我按照您发布的示例得到了这个结果。

> summary(mod)$r.squared * 750
[1] 681.0114
3个回答

不,数据不是异方差的(通过您模拟它们的方式)。您注意到测试的 0 自由度了吗?这暗示这里出了点问题。BP 检验从模型中获取平方残差,并检验模型中的预测变量(或您指定的任何其他预测变量)是否可以解释这些值中的大量可变性。由于您在模型中只有截距,因此它不能根据定义解释任何可变性。

看看:http ://en.wikipedia.org/wiki/Breusch-Pagan_test

另外,请确保您阅读help(bptest). 这应该有助于澄清事情。

这里出错的一件事是该bptest()函数显然没有测试这种错误情况,并且碰巧抛出了一个很小的 ​​p 值。事实上,如果你仔细查看bptest()函数底层的代码,基本上会发生这种情况:

format.pval(pchisq(0,0), digits=4)

这给出了"< 2.2e-16". 所以,pchisq(0,0)返回0然后变成"< 2.2e-16"format.pval()在某种程度上,这都是正确的,但它可能有助于测试零 dfs inbptest()以避免这种混淆。

编辑

关于这个问题仍然有很多困惑。也许它有助于真正展示 BP 测试的实际作用。这是一个例子。首先,让我们模拟一些同方差的数据。然后我们用两个预测变量拟合回归模型。bptest()然后我们用函数进行BP测试。

library(lmtest)
n <- 100    
x1i <- rnorm(n)
x2i <- rnorm(n)
yi  <- rnorm(n)
mod <- lm(yi ~ x1i + x2i)
bptest(mod)

那么,到底发生了什么?首先,根据回归模型取平方残差。然后在对包含在原始模型中的预测变量上的这些平方残差进行回归时 (请注意,该函数使用与原始模型中相同的预测变量,但如果有人怀疑,也可以在此处使用其他预测变量异方差是其他变量的函数)。这是 BP 检验的检验统计量。在同方差的原假设下,该检验统计量遵循卡方分布,其自由度等于检验中使用的预测变量的数量(不计算截距)。那么,让我们看看是否能得到相同的结果:n×R2bptest()

e2 <- resid(mod)^2
bp <- summary(lm(e2 ~ x1i + x2i))$r.squared * n
bp
pchisq(bp, df=2, lower.tail=FALSE)

是的,这行得通。偶然地,上面的测试结果可能是显着的(这是 I 类错误,因为模拟的数据是同方差的),但在大多数情况下它是不显着的。

如果没有一些预测因子,结果就没有意义(注df=0)。 异方差意味着方差不是恒定的,但相对于什么不是恒定的?也许您想到了索引(测量顺序)?那你应该做

y <- rnorm(1000)
x <- 1:1000
mod <- lm(y~x)
bptest(mod) # I get p=0.59

如果你只有一个数字向量,那么“方差是常数吗?”这个问题并没有太多意义。例如,考虑两个具有不同方差的正态分布的混合:

v <- sample(c(1,10), 100, repl=TRUE)
y <- rnorm(100, 0, v)

var(y|v)不是恒定的,而是取决于v. 但无条件,var(y)只是一个数字。

:Dail 要测试非常数方差,必须了解流行统计测试背后的假设。您需要遵循配方,即我在如何检查波动率是否平稳? 充分验证一个序列不能被证明具有非常数的方差。我概述的所有六个检验都必须接受非常数方差的原假设。被 6 个测试中的任何一个拒绝表明误差方差确实是非恒定的。