Dans la régression linéaire multiple, pourquoi un tracé de points prédits ne se trouve-t-il pas en ligne droite?

16

J'utilise la régression linéaire multiple pour décrire les relations entre Y et X1, X2.

D'après la théorie, j'ai compris que la régression multiple suppose des relations linéaires entre Y et chacun de X (Y et X1, Y et X2). Je n'utilise aucune transformation de X.

J'ai donc obtenu le modèle avec R = 0,45 et tous les X significatifs (P <0,05). Ensuite, j'ai tracé Y contre X1. Je ne comprends pas pourquoi les cercles rouges qui sont des prédictions du modèle ne forment pas une ligne. Comme je l'ai dit précédemment, je m'attendais à ce que chaque paire de Y et X soit ajustée par une ligne.

entrez la description de l'image ici

L'intrigue est générée en python de cette façon:

fig, ax = plt.subplots()
plt.plot(x['var1'], ypred, 'o', validation['var1'], validation['y'], 'ro');
ax.set_title('blue: true,   red: OLS')
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
Klausos
la source
1
Pouvez-vous publier le code que vous avez utilisé pour le tracé / l'analyse. Les lignes rouges et bleues ressemblent à des tremblements l'un de l'autre. Ainsi, le code derrière ce tracé pourrait aider à mieux répondre à votre problème.
Dawny33
Vous ne vous attendriez à une ligne que si (i) la valeur de l'autre prédicteur est supposée être la même pour chaque point prédit (et si vous essayez de supposer des valeurs différentes de x 2, vous obtenez une ligne différente), ou ( ii) si vous utilisez des prévisions pour vos données réelles, mais que vous "supprimez partiellement" (c.-à-d. compensez) les variations de x 2 , à quoi sert un graphique de régression partielle ou un graphique de variables ajoutées . Sans savoir exactement comment vous avez construit ce complot, il n'est pas possible de savoir quel est votre problème, comme le dit @ dawny33X2X2X2
Silverfish
Je pense que le commentaire de @Silverfish est correct; en trois dimensions représente un plan P . Si vous réduisez à deux dimensions, vous projetez le plan en trois dimensions ( P ) dans le plan par exemple ( y , x 1 ) , ce sera une ligne uniquement si P est orthogonal au plan ( y , x 1 ) . y=β0+β1X1+β2X2PP(y,X1)P(y,X1)
@ Dawny33: publié.
Klausos
@f coppens: Merci. Alors pourquoi la littérature dit-elle qu'un modèle de régression linéaire multiple suppose des relations linéaires entre Y et chacun de X (Y et X1, Y et X2)?
Klausos

Réponses:

33

Supposons que votre équation de régression multiple était

y^=2x1+5x2+3

Y signifie « prédite y ».y^y

Prenez maintenant uniquement les points pour lesquels . Ensuite , si vous tracez y contre x 1 , ces points satisferont l'équation:x2=1y^x1

y^=2X1+5(1)+3=2X1+8

Ils doivent donc se situer sur une ligne de pente 2 et avec une origine 8.y

Prenez maintenant les points pour lesquels . Lorsque vous tracez y contre x 1 , puis ces points satisfont:X2=2y^X1

y^=2x1+5(2)+3=2x1+13

C'est donc une ligne de pente 2 et avec -intercept 13. Vous pouvez vérifier par vous-même que si x 2 = 3, vous obtenez une autre ligne de pente 2 et y -intercept est 18.yx2=3y

Nous voyons que les points avec des valeurs différentes de trouveront sur des lignes différentes, mais tous avec le même gradient: la signification du coefficient de 2 x 1 dans l'équation de régression d'origine est que, ceteris paribus c'est-à-dire en maintenant les autres prédicteurs constants, un augmentation d' une unité dans x 1 augmente la réponse moyenne prédite de y par deux unités, tandis que le sens de l'ordonnée à l' origine de 3 dans l'équation de régression est que lorsque x 1 = 0 , et x 2 = 0 alors la réponse moyenne prédite est 3x22x1x1y^3x1=0x2=03. Mais tous vos points n'ont pas le même , ce qui signifie qu'ils se trouvent sur des lignes avec une intersection différente - la ligne n'aurait que 3 pour les points pour lesquels x 2 = 0 . Ainsi, plutôt que de voir une seule ligne, vous pouvez voir (s'il n'y a que certaines valeurs de x 2 qui se produisent, par exemple si x 2 est toujours entier) une série de "stries" diagonales. Considérons les données suivantes, où y = 2 x 1 + 5 x 2 + 3 .x23x2=0x2x2y^=2x1+5x2+3

Before lines added

Il y a ici des "stries" perceptibles. Maintenant, si je colorie les points pour lesquels en cercles rouges, x 2 = 2 en triangles dorés et x 2 = 3 en carrés bleus, nous voyons qu'ils se trouvent sur trois lignes distinctes, toutes de pente 2 et d' interceptions y 8, 13 et 18 comme calculé ci-dessus. Bien sûr, si x 2 n'était pas contraint de prendre des valeurs entières, ou si la situation était compliquée par d'autres variables prédictives incluses dans la régression, alors les stries diagonales seraient moins claires, mais ce serait toujours le cas pour chaque point prédit se trouve sur une ligne distinctex2=1x2=2x2=3yx2basé sur les valeurs des autres prédicteurs non représentés sur le graphique .

After lines added

yx1x2y^=2x1+5x2+3yx1x2yx1-l'axe pointe vers votre droite.

3d plot

yy

y^x1x2x2y^x1x2yx1 x2yx1

Code pour les tracés R

library(scatterplot3d)

data.df <- data.frame(
  x1 = c(0,2,4,5,8, 1,3,4,7,8, 0,3,5,6,7),
  x2 = c(1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3)
)

data.df$yhat <- with(data.df, 2*x1 + 5*x2 + 3)

data1.df <- data.df[data.df$x2==1,]
data2.df <- data.df[data.df$x2==2,]
data3.df <- data.df[data.df$x2==3,]

#Before lines added    
mar.default <- c(5,4,4,2) + 0.1
par(mar = mar.default + c(0, 1, 0, 0)) 
plot(data.df[c("x1","yhat")], main=expression("Predicted y against "*x[1]),
     xlab=expression(x[1]), ylab=expression(hat(y)))

#After lines added
plot(data.df[c("x1","yhat")], main=expression("Predicted y against "*x[1]),
     xlab=expression(x[1]), ylab=expression(hat(y)), pch=".")
points(data1.df[c("x1","yhat")], pch=19, col="red")
abline(lm(yhat ~ x1, data=data1.df), col="red")
points(data2.df[c("x1","yhat")], pch=17, col="gold")
abline(lm(yhat ~ x1, data=data2.df), col="gold")
points(data3.df[c("x1","yhat")], pch=15, col="blue")
abline(lm(yhat ~ x1, data=data3.df), col="blue")

#3d plot
myPlot <- scatterplot3d(data.df, pch=".", xlab=expression(x[1]),
                        ylab=expression(x[2]), zlab=expression(hat(y)),
                        main=expression("Predicted y against "*x[1]*" and "*x[2]))
myPlot$plane3d(Intercept=3, x.coef=2, y.coef=5, col="darkgrey")
myPlot$points3d(data1.df, pch=19, col="red")
myPlot$points3d(data2.df, pch=17, col="gold")
myPlot$points3d(data3.df, pch=15, col="blue")
print(myPlot)
Silverfish
la source
Juste une petite question: en disant avion, vous voulez dire aussi un avion qui peut avoir une courbure?
Klausos
Cela signifie un avion "plat". J'ajouterai une photo pour illustrer plus tard.
Silverfish
2
Je mets en vedette cette question juste pour pouvoir revenir à ces superbes intrigues
shadowtalker