Почему я получаю разные прогнозы для ручного полиномиального расширения и использую функцию R `poly`?


10

Почему я получаю разные прогнозы для ручного полиномиального расширения и использую polyфункцию 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)

введите описание изображения здесь

Моя попытка:

  • Кажется, это проблема с перехватом, когда я подгоняю модель с перехватом, т. Е. Нет -1в модели formula, две линии одинаковы. Но почему без перехвата две строки разные?

  • Другое «исправление» - использование rawполиномиального расширения вместо ортогонального полинома. Если мы изменим код на fit2 = lm(y~ poly(x,degree=2, raw=T) -1), сделаем 2 строки одинаковыми. Но почему?


4
Это не по теме из вашего вопроса, но вы часто очень открыты для комментариев. При чтении вашего кода первое, что я замечаю, это то, что вы используете =и <-для назначения непоследовательно. Я бы на самом деле не делал этого, это не совсем сбивало с толку, но добавляло много визуального шума в ваш код без какой-либо выгоды. Вы должны остановиться на том или ином, чтобы использовать его в своем личном коде, и просто придерживаться его.
Мэтью Друри

спасибо за помощь в кодировании! вопрос исправлен. @MatthewDrury
Du

3
Случайное наблюдение наконечник для изготовления <-меньше хлопот набрать: alt+-.
JAD

@JarkoDubbeldam спасибо за совет по кодированию. Я люблю ключевые порезы доски короткие
Хаитао Дю

Ответы:


12

Как вы правильно заметили, исходная разница заключается в том, что в первом случае вы используете «сырые» полиномы, а во втором - ортогональные полиномы. Поэтому, если последующий 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 XTXfitfit2fit2_b

Интересный побочный вопрос - почему fit_bи fit2_bтак одинаковы; В конце концов, матрицы моделей из fit_bи fit2_bне совпадают по номиналу . Здесь нам просто нужно запомнить это в конечном итоге fit_bи fit2_bиметь ту же информацию. fit2_bэто просто линейная комбинация, fit_bпоэтому по существу их результирующие посадки будут одинаковыми. Различия, наблюдаемые в подогнанном коэффициенте, отражают линейную рекомбинацию значений fit_b, чтобы получить их ортогональные. (см. ответ Г. Гротендика здесь для другого примера.)


+2,5 спасибо за отличный ответ. Что касается окончательного графика, я узнал от @kjetilb halvorsen: еще один абстрактный способ описания этого состоит в том, что сама модель зависит только от определенного линейного подпространства, а именно пространства столбцов, определяемого матрицей проекта. Но параметры зависят не только от этого подпространства, но и от основы этого подпространства, определяемой конкретными используемыми переменными, то есть самими столбцами. Например, прогнозы на основе модели будут зависеть только от линейного подпространства, а не от выбранного.
Haitao Du

надеюсь, вы не возражаете, я переформатировал немного ..
Haitao Du

@ hxd1011: Нет проблем, спасибо, что нашли время немного «прочесать».
usεr11852
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.