按残差的大小对数据集进行分层并进行两个样本比较是否完全合理?

机器算法验证 回归 残差
2022-02-05 05:35:24

这是我看到的一种临时方法,对我来说似乎很可疑,但也许我错过了一些东西。我已经在多元回归中看到了这一点,但让我们保持简单:

yi=β0+β1xi+εi

现在从拟合模型中获取残差

ei=yi(β^0+β^1xi)

并根据残差的大小对样本进行分层。例如,假设第一个样本是残差的底部 90%,第二个样本是顶部 10%,然后继续进行两个样本比较 - 我已经看到模型中的预测器都这样做了,x,以及不在模型中的变量。使用的非正式逻辑是,可能值远高于您在模型下预期的值(即大残差)的点在某些方面有所不同,并且以这种方式研究了这种差异。

我对这个问题的想法是:

  • 如果您在模型中的预测变量上看到 2 样本差异,则存在模型在其当前状态下未考虑的预测变量的影响(即非线性影响)。
  • 如果您看到模型中没有的变量存在 2 个样本差异,那么它可能一开始就应该存在于模型中。

我凭经验(通过模拟)发现的一件事是,如果您要比较模型中预测变量的平均值x并以这种方式分层以产生两个样本均值,x¯1x¯2, 它们之间呈正相关。这是有道理的,因为两个样本都依赖于y¯,x¯,σ^x,σ^yρ^xy. 这种相关性随着您向下移动截止值(即用于划分样本的百分比)而增加。因此,至少,如果您要进行两个样本比较,则分母中的标准误差t-statistic 需要调整以考虑相关性(尽管我还没有得出协方差的明确公式)。

无论如何,我的基本问题是:这样做有什么理由吗?如果是这样,在什么情况下这可能是有用的事情?显然,我认为没有,但可能有些事情我没有以正确的方式思考。

3个回答

比较均值太弱了:相反,比较分布。

还有一个问题是比较残差的大小(如前所述)还是比较残差本身更可取。因此,我评估两者。

具体来说是什么意思,这里有一些R代码可以比较(x,y)数据(以并行数组xy)通过回归yx,通过将残差切割成分位数以下,将残差分成三组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, 分位数q0q1,大小函数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 等基于回归的测试强大

我同意你的两个观点。如果模型不充分,则残差可能不是近似独立且同分布的。重要的变量可能被遗漏了,或者回归变量的函数形式可能是错误的。如果是这种情况,我会使用标准回归诊断来识别问题,而不是这个。您也可以在具有正确函数形式的模型中拥有正确的变量,但仍然具有非常数的方差。这可能只是通过绘制ei反对xi. 我可以说想通过某种形式的残差来找到模型中的异常值,但我会推荐一种影响函数方法来检测它们。我看不出这个程序完成了什么。

其他人评论说,这可能只是一个探索性工具,看看是否应该分别对两个数据集进行建模。如果是这种情况,这种方法和可能的其他探索性方法可能没问题。但是问题就变成了你接下来要做什么?如果你打算然后做两个单独的回归并对样本进行推断,我认为你需要以某种方式考虑你分割样本的方式。

我想这样做可能有几个动机,例如假设残差是一致的,那么您提到的方法可能有助于识别异常观察,因此第二步提供了“校正”估计量。但是,有更严格的技术可以执行异常值检测或提供对此类观察结果具有鲁棒性的估计器,如分位数回归、LMS(最小平方中位数)或 M 估计器等,其中所有这些方法都有明确的定义和已知的统计特性。(这已由@Michael Chernik 解决)

其他动机可能是集群识别,但与可用的集群检测技术相比,这是原始的,这些技术也得到了很好的定义和广泛实施。

在这两种情况下,使用残差似乎是非正式和原始的,但作为一种探索性工具仍然可以被容忍。它还取决于读者的领域。我会发现这对于一些定量工具可能不太受欢迎的社会科学是可以接受的。