Comme vous le constatez correctement, la différence d'origine est due au fait que dans le premier cas vous utilisez les polynômes "bruts" tandis que dans le second cas vous utilisez les polynômes orthogonaux. Par conséquent, si l' lm
appel ultérieur était modifié en: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)
nous obtiendrions les mêmes résultats entre fit
et fit3
. La raison pour laquelle nous obtenons les mêmes résultats dans ce cas est "triviale"; nous adaptons exactement le même modèle que nous avons équipé fit<-lm(y~.-1,data=x_exp)
, pas de surprise là-bas.
On peut facilement vérifier que les matrices de modèles des deux modèles sont identiques all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE
).
Ce qui est plus intéressant, c'est pourquoi vous obtiendrez les mêmes tracés lorsque vous utiliserez une interception. La première chose à noter est que, lors de l'ajustement d'un modèle avec une interception
Dans le cas de fit2
nous déplaçons simplement les prédictions du modèle verticalement; la forme réelle de la courbe est la même.
D'autre part, inclure une interception dans le cas des fit
résultats non seulement dans une ligne différente en termes de placement vertical, mais avec une forme globale complètement différente.
Nous pouvons facilement voir cela en ajoutant simplement les ajustements suivants sur le tracé existant.
fit_b<-lm(y~. ,data=x_exp)
yp=predict(fit_b,xp_exp)
lines(xp,yp, col='green', lwd = 2)
fit2_b<-lm(y~ poly(x,degree=2, raw = FALSE) )
yp=predict(fit2_b,data.frame(x=xp))
lines(xp,yp,col='blue')
OK ... Pourquoi les ajustements sans interception étaient-ils différents alors que les ajustements avec interception étaient les mêmes? Le hic est de nouveau à la condition d'orthogonalité.
Dans le cas où fit_b
la matrice modèle utilisée contient des éléments non orthogonaux, la matrice Gram crossprod( model.matrix(fit_b) )
est loin d'être diagonale; dans le cas des fit2_b
éléments orthogonaux ( crossprod( model.matrix(fit2_b) )
est effectivement diagonale).
fit
fit_b
XTXfit
fit2
fit2_b
La question secondaire intéressante est pourquoi les fit_b
et fit2_b
sont les mêmes; après tout, les matrices de modèle de fit_b
et fit2_b
ne sont pas les mêmes en valeur nominale . Ici, nous devons simplement nous souvenir de cela en fin de compte fit_b
et fit2_b
avoir les mêmes informations. fit2_b
est juste une combinaison linéaire des fit_b
ajustements si essentiellement résultants seront les mêmes. Les différences observées dans le coefficient ajusté reflètent la recombinaison linéaire des valeurs de fit_b
afin de les rendre orthogonales. (Voir la réponse de G. Grothendieck ici aussi pour un exemple différent.)
=
et<-
pour l'affectation de manière incohérente. Je ne ferais vraiment pas cela, ce n'est pas vraiment déroutant, mais cela ajoute beaucoup de bruit visuel à votre code sans aucun avantage. Vous devez vous contenter de l'un ou de l'autre à utiliser dans votre code personnel et vous y tenir.