比较均值太弱了:相反,比较分布。
还有一个问题是比较残差的大小(如前所述)还是比较残差本身更可取。因此,我评估两者。
具体来说是什么意思,这里有一些R
代码可以比较(x,y)数据(以并行数组x
和y
)通过回归y在x,通过将残差切割成分位数以下,将残差分成三组q0及以上分位数q1>q0, 和(通过 qq 图)比较分布x与这两组相关的值。
test <- function(y, x, q0, q1, abs0=abs, ...) {
y.res <- abs0(residuals(lm(y~x)))
y.groups <- cut(y.res, quantile(y.res, c(0,q0,q1,1)))
x.groups <- split(x, y.groups)
xy <- qqplot(x.groups[[1]], x.groups[[3]], plot.it=FALSE)
lines(xy, xlab="Low residual", ylab="High residual", ...)
}
此函数的第五个参数abs0
,默认情况下使用残差的大小(绝对值)来形成组。稍后我们可以将其替换为使用残差本身的函数。
残差用于检测许多事物:异常值、与外生变量的可能相关性、拟合优度和同方差性。就其性质而言,异常值应该很少且孤立,因此不会在这里发挥有意义的作用。为了使这个分析简单,让我们探讨最后两个:拟合优度(即x-y关系)和同方差性(即残差大小的恒定性)。我们可以通过模拟来做到这一点:
simulate <- function(n, beta0=0, beta1=1, beta2=0, sd=1, q0=1/3, q1=2/3, abs0=abs,
n.trials=99, ...) {
x <- 1:n - (n+1)/2
y <- beta0 + beta1 * x + beta2 * x^2 + rnorm(n, sd=sd)
plot(x,y, ylab="y", cex=0.8, pch=19, ...)
plot(x, res <- residuals(lm(y ~ x)), cex=0.8, col="Gray", ylab="", main="Residuals")
res.abs <- abs0(res)
r0 <- quantile(res.abs, q0); r1 <- quantile(res.abs, q1)
points(x[res.abs < r0], res[res.abs < r0], col="Blue")
points(x[res.abs > r1], res[res.abs > r1], col="Red")
plot(x,x, main="QQ Plot of X",
xlab="Low residual", ylab="High residual",
type="n")
abline(0,1, col="Red", lwd=2)
temp <- replicate(n.trials, test(beta0 + beta1 * x + beta2 * x^2 + rnorm(n, sd=sd),
x, q0=q0, q1=q1, abs0=abs0, lwd=1.25, lty=3, col="Gray"))
test(y, x, q0=q0, q1=q1, abs0=abs0, lwd=2, col="Black")
}
此代码接受确定线性模型的参数:其系数y∼β0+β1x+β2x2, 误差项的标准差sd
, 分位数q0和q1,大小函数abs0
,以及模拟中的独立试验次数,n.trials
。第一个参数n
是每次试验中要模拟的数据量。它产生一组图——(x,y)数据,它们的残差,以及多次试验的 qq 图——帮助我们理解所提出的测试对于给定模型(由n
、beta、s 和确定sd
)是如何工作的。这些图的示例如下所示。
现在让我们使用这些工具来探索非线性和异方差的一些现实组合,使用残差的绝对值:
n <- 100
beta0 <- 1
beta1 <- -1/n
sigma <- 1/n
size <- function(x) abs(x)
set.seed(17)
par(mfcol=c(3,4))
simulate(n, beta0, beta1, 0, sigma*sqrt(n), abs0=size, main="Linear Homoscedastic")
simulate(n, beta0, beta1, 0, 0.5*sigma*(n:1), abs0=size, main="Linear Heteroscedastic")
simulate(n, beta0, beta1, 1/n^2, sigma*sqrt(n), abs0=size, main="Quadratic Homoscedastic")
simulate(n, beta0, beta1, 1/n^2, 5*sigma*sqrt(1:n), abs0=size, main="Quadratic Heteroscedastic")
输出是一组图。第一行显示一个模拟数据集,第二行显示其残差的散点图x(按分位数进行颜色编码:红色表示大值,蓝色表示小值,灰色表示未进一步使用的任何中间值),第三行显示所有试验的 qq 图,其中一个模拟数据集的 qq 图显示在黑色的。一个单独的 qq 图比较了x与高残差相关的值x与低残差相关的值;经过多次试验,出现了一个可能是 qq 图的灰色信封。我们感兴趣的是,这些包络随着偏离基本线性模型而变化的方式和强度:强烈的变化意味着良好的辨别力。
最后三列和第一列之间的差异清楚地表明该方法能够检测异方差性,但在识别中等非线性时可能不是那么有效。它很容易将非线性与异方差混淆。这是因为这里模拟的异方差形式(很常见)是残差的预期大小随x. 这种趋势很容易被发现。另一方面,二次非线性会在范围的两端和中间产生较大的残差x价值观。仅通过查看受影响的分布很难区分x价值观。
让我们做同样的事情,使用完全相同的数据,但分析残差本身。为此,在进行此修改后重新运行之前的代码块:
size <- function(x) x
这种变化不能很好地检测异方差性:看看前两列中的 qq 图有多相似。但是,它在检测非线性方面做得很好。这是因为残差将x分为中间部分和外部部分,这将是完全不同的。然而,如最右列所示,异方差可以掩盖非线性。
也许将这两种技术结合起来会奏效。这些模拟(以及它们的变体,感兴趣的读者可以随意运行)表明这些技术并非没有优点。
然而,一般来说,以标准方式检查残差会更好。对于自动化工作,已经开发了正式的测试来检测我们在残差图中寻找的东西。例如,Breusch-Pagan 检验将残差平方(而不是它们的绝对值)与x. 可以本着同样的精神来理解这个问题中提出的测试。然而,通过将数据分成两组,从而忽略了由(x,y^−x)对,我们可以预期建议的测试不如 Breusch-Pagan 等基于回归的测试强大。