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 lmchamada posterior fosse alterada para: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)obteríamos os mesmos resultados entre fite 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 fitresultados 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_bmatriz modelo utilizada conter elementos não ortogonais, a matriz Gram crossprod( model.matrix(fit_b) )está longe de ser diagonal; no caso dos fit2_belementos são ortogonais ( crossprod( model.matrix(fit2_b) )é efetivamente diagonal).
fitfit_b XTXfitfit2fit2_b
A questão interessante é por que os fit_be fit2_bsão os mesmos; afinal todas as matrizes de modelo fit_be fit2_bnão são iguais no valor de face . Aqui, apenas precisamos lembrar disso fit_be fit2_bter as mesmas informações. fit2_bé apenas uma combinação linear do fit_bmodo 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.