Pourquoi j'obtiens des prévisions différentes pour l'expansion polynomiale manuelle et l'utilisation de la poly
fonction R ?
set.seed(0)
x <- rnorm(10)
y <- runif(10)
plot(x,y,ylim=c(-0.5,1.5))
grid()
# xp is a grid variable for ploting
xp <- seq(-3,3,by=0.01)
x_exp <- data.frame(f1=x,f2=x^2)
fit <- lm(y~.-1,data=x_exp)
xp_exp <- data.frame(f1=xp,f2=xp^2)
yp <- predict(fit,xp_exp)
lines(xp,yp)
# using poly function
fit2 <- lm(y~ poly(x,degree=2) -1)
yp <- predict(fit2,data.frame(x=xp))
lines(xp,yp,col=2)
Ma tentative:
Il semble que ce soit un problème d'interception, lorsque j'adapte le modèle avec interception, c'est-à-dire, pas
-1
de modèleformula
, les deux lignes sont identiques. Mais pourquoi sans l'interception les deux lignes sont différentes?Un autre «correctif» utilise l'
raw
expansion polynomiale au lieu du polynôme orthogonal. Si nous changeons le code enfit2 = lm(y~ poly(x,degree=2, raw=T) -1)
, cela fera 2 lignes identiques. Mais pourquoi?
r
regression
polynomial
Haitao Du
la source
la source
=
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.<-
moins de tracas à taper:alt+-
.Réponses:
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 entrefit
etfit3
. 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.
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 Gramcrossprod( model.matrix(fit_b) )
est loin d'être diagonale; dans le cas desfit2_b
éléments orthogonaux (crossprod( model.matrix(fit2_b) )
est effectivement diagonale).fit
fit_b
fit
fit2
fit2_b
La question secondaire intéressante est pourquoi les
fit_b
etfit2_b
sont les mêmes; après tout, les matrices de modèle defit_b
etfit2_b
ne sont pas les mêmes en valeur nominale . Ici, nous devons simplement nous souvenir de cela en fin de comptefit_b
etfit2_b
avoir les mêmes informations.fit2_b
est juste une combinaison linéaire desfit_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 defit_b
afin de les rendre orthogonales. (Voir la réponse de G. Grothendieck ici aussi pour un exemple différent.)la source