Par construction, le terme d'erreur dans un modèle OLS n'est pas corrélé avec les valeurs observées des covariables X. Cela sera toujours vrai pour les données observées même si le modèle produit des estimations biaisées qui ne reflètent pas les vraies valeurs d'un paramètre car une hypothèse du modèle est violée (comme un problème de variable omise ou un problème de causalité inverse). Les valeurs prévues sont entièrement fonction de ces covariables et ne sont donc pas non plus corrélées avec le terme d'erreur. Ainsi, lorsque vous tracez des résidus par rapport à des valeurs prédites, ils doivent toujours sembler aléatoires car ils ne sont en effet pas corrélés par la construction de l'estimateur. En revanche, il est tout à fait possible (et même probable) que le terme d'erreur d'un modèle soit corrélé avec Y dans la pratique. Par exemple, avec une variable X dichotomique, plus le vrai Y est éloignéE(Y | X = 1)
ou E(Y | X = 0)
alors plus le résidu sera grand. Voici la même intuition avec les données simulées dans R où nous savons que le modèle est non biaisé car nous contrôlons le processus de génération des données:
rm(list=ls())
set.seed(21391209)
trueSd <- 10
trueA <- 5
trueB <- as.matrix(c(3,5,-1,0))
sampleSize <- 100
# create independent x-values
x1 <- rnorm(n=sampleSize, mean = 0, sd = 4)
x2 <- rnorm(n=sampleSize, mean = 5, sd = 10)
x3 <- 3 + x1 * 4 + x2 * 2 + rnorm(n=sampleSize, mean = 0, sd = 10)
x4 <- -50 + x1 * 7 + x2 * .5 + x3 * 2 + rnorm(n=sampleSize, mean = 0, sd = 20)
X = as.matrix(cbind(x1,x2,x3,x4))
# create dependent values according to a + bx + N(0,sd)
Y <- trueA + X %*% trueB +rnorm(n=sampleSize,mean=0,sd=trueSd)
df = as.data.frame(cbind(Y,X))
colnames(df) <- c("y", "x1", "x2", "x3", "x4")
ols = lm(y~x1+x2+x3+x4, data = df)
y_hat = predict(ols, df)
error = Y - y_hat
cor(y_hat, error) #Zero
cor(Y, error) #Not Zero
Nous obtenons le même résultat de corrélation nulle avec un modèle biaisé, par exemple si nous omettons x1.
ols2 = lm(y~x2+x3+x4, data = df)
y_hat2 = predict(ols2, df)
error2 = Y - y_hat2
cor(y_hat2, error2) #Still zero
cor(Y, error2) #Not Zero