Como você nota corretamente, a diferença original é que, no primeiro caso, você usa os polinômios "brutos", enquanto no segundo caso, usa os polinômios ortogonais. Portanto, se a lm
chamada posterior fosse alterada para: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)
obteríamos os mesmos resultados entre fit
e fit3
. A razão pela qual obtemos os mesmos resultados neste caso é "trivial"; nos encaixamos exatamente no mesmo modelo em que nos encaixamos fit<-lm(y~.-1,data=x_exp)
, sem surpresas.
Pode-se facilmente verificar se as matrizes dos dois modelos são iguais all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE
).
O mais interessante é o motivo pelo qual você obterá os mesmos gráficos ao usar uma interceptação. A primeira coisa a notar é que, ao ajustar um modelo com uma interceptação
No caso fit2
, simplesmente movemos as previsões do modelo verticalmente; a forma real da curva é a mesma.
Por outro lado, incluir uma interceptação no caso de fit
resultados não apenas em uma linha diferente em termos de posicionamento vertical, mas com uma forma totalmente diferente em geral.
Podemos ver facilmente isso simplesmente anexando os seguintes ajustes no gráfico existente.
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 ... Por que os ajustes de não interceptação são diferentes, enquanto os ajustes de inclusão de interceptação são iguais? A captura está novamente na condição de ortogonalidade.
No caso da fit_b
matriz modelo utilizada conter elementos não ortogonais, a matriz Gram crossprod( model.matrix(fit_b) )
está longe de ser diagonal; no caso dos fit2_b
elementos são ortogonais ( crossprod( model.matrix(fit2_b) )
é efetivamente diagonal).
fit
fit_b
XTXfit
fit2
fit2_b
A questão interessante é por que os fit_b
e fit2_b
são os mesmos; afinal todas as matrizes de modelo fit_b
e fit2_b
não são iguais no valor de face . Aqui, apenas precisamos lembrar disso fit_b
e fit2_b
ter as mesmas informações. fit2_b
é apenas uma combinação linear do fit_b
modo que seus ajustes resultantes serão os mesmos. As diferenças observadas no coeficiente ajustado refletem a recombinação linear dos valores de fit_b
, a fim de obtê-los ortogonais. (veja G. Grothendieck responda aqui também para exemplos diferentes.)
=
e<-
para atribuição de forma inconsistente. Eu realmente não faria isso, não é exatamente confuso, mas adiciona muito ruído visual ao seu código, sem nenhum benefício. Você deve optar por um ou outro para usar em seu código pessoal e ficar com ele.