Poly() в lm(): разница между исходным и ортогональным

У меня

library(ISLR)
attach(Wage)

# Polynomial Regression and Step Functions

fit=lm(wage~poly(age,4),data=Wage)
coef(summary(fit))

fit2=lm(wage~poly(age,4,raw=T),data=Wage)
coef(summary(fit2))

plot(age, wage)
lines(20:350, predict(fit, newdata = data.frame(age=20:350)), lwd=3, col="darkred")
lines(20:350, predict(fit2, newdata = data.frame(age=20:350)), lwd=3, col="darkred")

Линии прогнозирования кажутся одинаковыми, однако почему коэффициенты настолько различны? Как вы intepret их в raw=T и raw=F.

Я вижу, что коэффициенты, созданные с помощью poly(...,raw=T), соответствуют тем, у которых ~age+I(age^2)+I(age^3)+I(age^4).

Если я хочу использовать коэффициенты для получения предсказания "вручную" (без использования функции predict()), есть ли что-то, на что я должен обратить внимание? Как интерпретировать коэффициенты ортогональных многочленов от poly().

Ответы

Ответ 1

По умолчанию с raw = FALSE, poly() вычисляется ортогональный многочлен. Он внутренне устанавливает матрицу модели с исходным кодированием x, x ^ 2, x ^ 3,... сначала, а затем масштабирует столбцы, чтобы каждый столбец был ортогонален предыдущим. Это не изменяет установленные значения, но имеет то преимущество, что вы можете видеть, что определенный порядок в полиноме значительно улучшает регрессию по более низким порядкам.

Рассмотрим простые данные cars с остановкой ответа dist ance и вождением speed. Физически это должно иметь квадратичную зависимость, но в этом (старом) наборе данных квадратичный член не имеет значения:

m1 <- lm(dist ~ poly(speed, 2), data = cars)
m2 <- lm(dist ~ poly(speed, 2, raw = TRUE), data = cars)

В ортогональном кодировании вы получаете следующие коэффициенты в summary(m1):

                Estimate Std. Error t value Pr(>|t|)    
(Intercept)       42.980      2.146  20.026  < 2e-16 ***
poly(speed, 2)1  145.552     15.176   9.591 1.21e-12 ***
poly(speed, 2)2   22.996     15.176   1.515    0.136    

Это показывает, что существует очень значительный линейный эффект, тогда как второй порядок несуществен. Последнее p-значение (то есть одно из наивысшего порядка в многочлене) такое же, как в исходном кодировании:

                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                  2.47014   14.81716   0.167    0.868
poly(speed, 2, raw = TRUE)1  0.91329    2.03422   0.449    0.656
poly(speed, 2, raw = TRUE)2  0.09996    0.06597   1.515    0.136

но p-значения более низкого порядка резко меняются. Причина в том, что в модели m1 регрессоры ортогональны, а они сильно коррелированы в m2:

cor(model.matrix(m1)[, 2], model.matrix(m1)[, 3])
## [1] 4.686464e-17
cor(model.matrix(m2)[, 2], model.matrix(m2)[, 3])
## [1] 0.9794765

Таким образом, в исходном кодировании вы можете интерпретировать только p-значение speed, если speed^2 остается в модели. И поскольку оба регрессора сильно коррелированы, один из них можно отбросить. Однако в ортогональном кодировании speed^2 фиксируется только квадратичная часть, которая не была зафиксирована линейным членом. И тогда становится ясно, что линейная часть значительна, а квадратичная часть не имеет никакого дополнительного значения.

Ответ 2

Я полагаю, что метод полиномиальной регрессии будет выполняться на основе raw=T, это то, что можно было бы взглянуть на самый высокий коэффициент мощности и оценить его значение на основе pvalue для этого коэффициента.

Если найдено незначительное (большое pvalue), то регрессия будет повторно запущена без этой особой несущественной силы (т.е. следующей более низкой степени), и это будет выполняться на один шаг за раз, уменьшая, если не значительное.

Если в любой момент значительная степень важна, тогда процесс остановится и утвердит, что эта степень является подходящей.