不,数据不是异方差的(通过您模拟它们的方式)。您注意到测试的 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 类错误,因为模拟的数据是同方差的),但在大多数情况下它是不显着的。