Как вы правильно заметили, исходная разница заключается в том, что в первом случае вы используете «сырые» полиномы, а во втором - ортогональные полиномы. Поэтому, если последующий 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) )
эффективно диагонали).
fit
fit_b
ИксTИксfit
fit2
fit2_b
Интересный побочный вопрос - почему fit_b
и fit2_b
так одинаковы; В конце концов, матрицы моделей из fit_b
и fit2_b
не совпадают по номиналу . Здесь нам просто нужно запомнить это в конечном итоге fit_b
и fit2_b
иметь ту же информацию. fit2_b
это просто линейная комбинация, fit_b
поэтому по существу их результирующие посадки будут одинаковыми. Различия, наблюдаемые в подогнанном коэффициенте, отражают линейную рекомбинацию значений fit_b
, чтобы получить их ортогональные. (см. ответ Г. Гротендика здесь для другого примера.)
=
и<-
для назначения непоследовательно. Я бы на самом деле не делал этого, это не совсем сбивало с толку, но добавляло много визуального шума в ваш код без какой-либо выгоды. Вы должны остановиться на том или ином, чтобы использовать его в своем личном коде, и просто придерживаться его.