Почему я получаю разные прогнозы для ручного полиномиального расширения и использую 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 строки одинаковыми. Но почему?
r
regression
polynomial
Хайтау Ду
источник
источник
=
и<-
для назначения непоследовательно. Я бы на самом деле не делал этого, это не совсем сбивало с толку, но добавляло много визуального шума в ваш код без какой-либо выгоды. Вы должны остановиться на том или ином, чтобы использовать его в своем личном коде, и просто придерживаться его.<-
меньше хлопот набрать:alt+-
.Ответы:
Как вы правильно заметили, исходная разница заключается в том, что в первом случае вы используете «сырые» полиномы, а во втором - ортогональные полиномы. Поэтому, если последующий
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
когда используемая матрица модели содержит неортогональные элементы, матрица Грамаcrossprod( model.matrix(fit_b) )
далека от диагонали; в случаеfit2_b
элементы являются ортогональными (crossprod( model.matrix(fit2_b) )
эффективно диагонали).fit
fit_b
fit
fit2
fit2_b
Интересный побочный вопрос - почему
fit_b
иfit2_b
так одинаковы; В конце концов, матрицы моделей изfit_b
иfit2_b
не совпадают по номиналу . Здесь нам просто нужно запомнить это в конечном итогеfit_b
иfit2_b
иметь ту же информацию.fit2_b
это просто линейная комбинация,fit_b
поэтому по существу их результирующие посадки будут одинаковыми. Различия, наблюдаемые в подогнанном коэффициенте, отражают линейную рекомбинацию значенийfit_b
, чтобы получить их ортогональные. (см. ответ Г. Гротендика здесь для другого примера.)источник