当我将样本分成子集时,自变量的斜率更大

机器算法验证 回归 最小二乘
2022-03-23 18:32:15

我发现了意想不到的结果,我不确定我是否在某个地方犯了错误。

在使用完整样本的 OLS 回归中,我发现感兴趣的自变量的斜率为 0.03 且显着。然而,当我将样本分成两个子集时(我将样本分成大约 50/50),我发现使用这些子集的两个 OLS 回归都有显着的结果。但是,斜率为 0.08 和 0.07。这感觉有点违反直觉,因为我不明白为什么在划分样本时斜率会更大。相反,我希望使用完整样本的斜率应该位于使用子集的斜率之间。

有谁知道我的发现是否仍然有效?

2个回答

当您将数据分成系统不同的组时,这是一种非常常见的情况。这是一个例子:

set.seed(4218)
N = 100
group <- rep(1:2, each = N%/%2)
x <- rnorm(N)
y <- sqrt(.2) * x + sqrt(.8) * rnorm(N)
x[group==2] <- x[group==2]+5
splitByGroup <- split(cbind.data.frame(x=x,y=y), group)

modelAll <- lm(y~x)
modelG1 <- lm(y~x, data=splitByGroup[[1]])
modelG2 <- lm(y~x, data=splitByGroup[[2]])

plot(y~x, col = group + 1)
abline(coef=modelAll$coef, col = 4, lwd = 2)
abline(coef=modelG1$coef, col = 2, lwd = 2)
abline(coef=modelG2$coef, col = 3, lwd = 2)
legend("topleft", col = 2:4, lwd=2,
    legend = paste("Slope for", c("group 1", "group 2", "both groups"), "=",
        round(c(modelG1$coef[2],modelG2$coef[2],modelAll$coef[2]),3)))

不同的斜坡,不同的 folx

在这里,整体斜率减弱,因为我们没有考虑group但是,如果我们group在我们的模型中包含,我们可以恢复组内斜率的加权平均值(如您所见):

modelAll2 <- lm(y~x + group)
summary(modelAll2)$coef

              Estimate Std. Error   t value     Pr(>|t|)
(Intercept)  1.3079814 0.45867941  2.851624 5.315169e-03
x            0.3730811 0.08017352  4.653420 1.034285e-05
group       -1.5352505 0.42212272 -3.636977 4.440556e-04

这是可能的,因为不同数据子集的不同分布可能具有不同的性质。如果没有图表,这将很难描述,但想象一下正方形左上角的一小团点。让我们假设这些点紧跟雪茄形点云,这表明存在正相关。现在,想象另一个重复的点云,但在正方形的右下角。让我们保持点云的距离足够远,这样它们就不会真正重叠。

如果您分别对每个云进行回归,您将获得一个正斜率。但是,如果您将数据集合并为一个(并忽略分组结构),那么聚合回归的斜率将是负数。

这个例子比你所描述的要极端一些,但同样的一般理论可以解释你所观察到的。