为什么我在这个指定良好的模型中看到残差模式?

机器算法验证 最小二乘 残差 假设 诊断
2022-03-25 20:15:48

我使用模拟数据制作了一个模型。

然后我在上面安装了一个OLS。

我知道 OLS 的假设得到尊重,因为这是模拟数据。

无论残差中存在模式,它们似乎都不是零均值。

这是为什么?

这是我的代码和诊断图:

df <- data.frame(id=seq(1, 12, 1))
df$age <- c(18, 19, 20, 40, 41, 42,
            60, 61, 62, 40, 41, 42)
df$treat <- c(rep(1,6), rep(0,6))
df$rec <- 2*df$age + rnorm(nrow(df), 0, 2)

mod2 <- lm(df$rec ~ df$treat+df$age)
print(summary(mod2))
par(mfrow=c(2,2))
plot(mod2)

在此处输入图像描述

2个回答

值处的残差与零的接近程度取决于样本量。现在,实际示例中的样本量将是任意大小,因此说它应该更大并没有多大用处,但您确实需要校准您对小样本可检测到哪种偏离零均值的期望。x

朝着这个方向迈出的一个有用的步骤是模拟多个实现,而不仅仅是一个。这是您的诊断中左上图的四个实现 在此处输入图像描述

只看其中一个,您可能会认为有一个模式。查看所有四个显示了偶然出现的那种“模式”。您可以对多个样本量执行此操作,并更多地了解从精心指定的模型中偶然出现的模式与有意义的模式。

托马斯的回答很好(+1),我只是想澄清你问题措辞中的一个特别混乱:

残差中有一个模式,它们似乎不是零均值。

平均值为零您可以轻松检查:

set.seed(1)
df <- data.frame(id=seq(1, 12, 1))
df$age <- c(18, 19, 20, 40, 41, 42,
            60, 61, 62, 40, 41, 42)
df$treat <- c(rep(1,6), rep(0,6))
df$rec <- 2*df$age + rnorm(nrow(df), 0, 2)
mod2 <- lm(df$rec ~ df$treat+df$age)

# Mean value of the residuals
mean(residuals(mod2))

这等于-6.473289e-17,即这里与零的唯一区别是由于(缺乏)精度。0.00000000000000006470

请注意,您甚至不必将第二个参数设置rnorm()为零:

set.seed(1)
df <- data.frame(id=seq(1, 12, 1))
df$age <- c(18, 19, 20, 40, 41, 42,
            60, 61, 62, 40, 41, 42)
df$treat <- c(rep(1,6), rep(0,6))
df$rec <- 2*df$age + rnorm(nrow(df), 1000, 2) # large mean
mod2 <- lm(df$rec ~ df$treat+df$age)

# Mean value of the residuals
mean(residuals(mod2))

返回-1.853384e-17...实际上仍然为零。所以发生了什么事?1000刚刚被添加到拦截中