Как вы правильно заметили, исходная разница заключается в том, что в первом случае вы используете «сырые» полиномы, а во втором - ортогональные полиномы. Поэтому, если последующий lmвызов был изменен на: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)мы получили бы те же результаты между fitи fit3. Причина, по которой мы получаем одинаковые результаты в этом случае, является «тривиальной»; мы вписываемся в ту же модель, что и у нас fit<-lm(y~.-1,data=x_exp), никаких сюрпризов.
Можно легко проверить, что матрицы моделей по двум моделям совпадают all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE).
Что еще интереснее, так это то, почему вы получите те же графики при использовании перехвата. Первое, на что нужно обратить внимание, это то, что при подборе модели с перехватом
В случае fit2мы просто перемещаем предсказания модели по вертикали; фактическая форма кривой такая же.
С другой стороны, включение пересечения в случае fitрезультатов в не только другую линию с точки зрения вертикального размещения, но и с совершенно другой формой в целом.
Мы можем легко увидеть это, просто добавив следующие соответствия на существующий график.
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')

Хорошо ... Почему совпадения без перехвата были разными, в то время как совпадения с перехватом одинаковы? Подвох опять на условии ортогональности.
В случае, fit_bкогда используемая матрица модели содержит неортогональные элементы, матрица Грама crossprod( model.matrix(fit_b) )далека от диагонали; в случае fit2_bэлементы являются ортогональными ( crossprod( model.matrix(fit2_b) )эффективно диагонали).
fitfit_b ИксTИксfitfit2fit2_b
Интересный побочный вопрос - почему fit_bи fit2_bтак одинаковы; В конце концов, матрицы моделей из fit_bи fit2_bне совпадают по номиналу . Здесь нам просто нужно запомнить это в конечном итоге fit_bи fit2_bиметь ту же информацию. fit2_bэто просто линейная комбинация, fit_bпоэтому по существу их результирующие посадки будут одинаковыми. Различия, наблюдаемые в подогнанном коэффициенте, отражают линейную рекомбинацию значений fit_b, чтобы получить их ортогональные. (см. ответ Г. Гротендика здесь для другого примера.)
=и<-для назначения непоследовательно. Я бы на самом деле не делал этого, это не совсем сбивало с толку, но добавляло много визуального шума в ваш код без какой-либо выгоды. Вы должны остановиться на том или ином, чтобы использовать его в своем личном коде, и просто придерживаться его.