Подтвердить что ты не робот

Что делает функция "pol" на самом деле?

Я прочитал страницу руководства ?poly (которую, я признаю, я не полностью понял), а также прочитал описание функции в книге Введение в статистическое обучение.

Насколько я понимаю, вызов poly(horsepower, 2) должен быть эквивалентен написанию horsepower + I(horsepower^2). Однако это, похоже, противоречит выводу следующего кода:

library(ISLR)

summary(lm(mpg~poly(horsepower,2), data=Auto))$coef

    #                       Estimate Std. Error   t value      Pr(>|t|)
    #(Intercept)            23.44592  0.2209163 106.13030 2.752212e-289
    #poly(horsepower, 2)1 -120.13774  4.3739206 -27.46683  4.169400e-93
    #poly(horsepower, 2)2   44.08953  4.3739206  10.08009  2.196340e-21

summary(lm(mpg~horsepower+I(horsepower^2), data=Auto))$coef

    #                    Estimate   Std. Error   t value      Pr(>|t|)
    #(Intercept)     56.900099702 1.8004268063  31.60367 1.740911e-109
    #horsepower      -0.466189630 0.0311246171 -14.97816  2.289429e-40
    #I(horsepower^2)  0.001230536 0.0001220759  10.08009  2.196340e-21

Мой вопрос: почему не совпадают выходы, и что на самом деле делает poly?

4b9b3361

Ответ 1

При введении полиномиальных членов в статистической модели обычная мотивация заключается в том, чтобы определить, является ли ответ "изогнутым", и является ли кривизна "значимой", когда этот термин добавлен. Результат метания в терминах +I(x^2) что незначительные отклонения могут быть "увеличены" процессом подгонки в зависимости от их местоположения и неверно истолкованы из-за термина кривизны, когда они были просто колебаниями на одном конце или другом диапазоне данных. Это приводит к неуместному присваиванию деклараций "значимости".

Если вы просто вставляете квадрат с I(x^2), по необходимости он также будет сильно коррелирован с x, по крайней мере, в домене, где x > 0. Вместо этого: poly(x,2) создает "изогнутый" набор переменных, где линейный член не так сильно коррелирован с x, и где кривизна примерно одинакова по всему диапазону данных. (Если вы хотите прочитать статистическую теорию, найдите "ортогональные полиномы".) Просто введите poly(1:10, 2) и посмотрите на два столбца.

poly(1:10, 2)
                1           2
 [1,] -0.49543369  0.52223297
 [2,] -0.38533732  0.17407766
 [3,] -0.27524094 -0.08703883
 [4,] -0.16514456 -0.26111648
 [5,] -0.05504819 -0.34815531
 [6,]  0.05504819 -0.34815531
 [7,]  0.16514456 -0.26111648
 [8,]  0.27524094 -0.08703883
 [9,]  0.38533732  0.17407766
[10,]  0.49543369  0.52223297
attr(,"degree")
[1] 1 2
attr(,"coefs")
attr(,"coefs")$alpha
[1] 5.5 5.5

attr(,"coefs")$norm2
[1]   1.0  10.0  82.5 528.0

attr(,"class")
[1] "poly"   "matrix"

"Квадратичный" член центрируется на 5.5, а линейный член сдвигается вниз, так что он равен 0 в той же точке x (при неявном члене (Intercept) в модели зависит от смещения всего назад на запрашиваются временные предсказания.)

Ответ 2

Необработанные полиномы

Чтобы получить обычные полиномы, как в вопросе, используйте raw = TRUE. К сожалению, в регрессии есть нежелательный аспект с обычными полиномами. Если мы подгоняем квадратик, скажем, а затем кубику, то все коэффициенты младшего порядка кубики будут отличаться от квадратичной, т.е..688501e -0 1, 2.079011e -0 3 после переоборудования с кубиком ниже.

library(ISLR)
fm2raw <- lm(mpg ~ poly(horsepower, 2, raw = TRUE), Auto)
cbind(coef(fm2raw))
##                                          [,1]
## (Intercept)                      56.900099702
## poly(horsepower, 2, raw = TRUE)1 -0.466189630
## poly(horsepower, 2, raw = TRUE)2  0.001230536

fm3raw <- lm(mpg ~ poly(horsepower, 3, raw = TRUE), Auto)
cbind(coef(fm3raw))
##                                           [,1]
## (Intercept)                       6.068478e+01
## poly(horsepower, 3, raw = TRUE)1 -5.688501e-01
## poly(horsepower, 3, raw = TRUE)2  2.079011e-03
## poly(horsepower, 3, raw = TRUE)3 -2.146626e-06

Ортогональные многочлены

Что нам действительно нужно, так это добавить кубический член таким образом, чтобы коэффициенты более низкого порядка, которые были подобраны с использованием квадратичного, остались прежними после переоборудования с кубическим подгонкой. Для этого возьмите линейные комбинации столбцов в poly(horsepower, 2, raw = TRUE) и сделайте то же самое с poly(horsepower, 3, raw = TRUE), чтобы столбцы в квадратичной аппроксимации были ортогональны друг другу и аналогично для кубической аппроксимации. Этого достаточно, чтобы гарантировать, что коэффициенты более низкого порядка не изменятся, когда мы добавим коэффициенты более высокого порядка. Обратите внимание, что первые три коэффициента теперь одинаковы в двух наборах ниже (тогда как выше они отличаются). То есть в обоих случаях ниже 3 коэффициентов более низкого порядка 23,44592, -120.13774 и 44,08953.

fm2 <- lm(mpg ~ poly(horsepower, 2), Auto)
cbind(coef(fm2))
##                            [,1]
## (Intercept)            23.44592
## poly(horsepower, 2)1 -120.13774
## poly(horsepower, 2)2   44.08953

fm3 <- lm(mpg ~ poly(horsepower, 3), Auto)
cbind(coef(fm3))
##                             [,1]
## (Intercept)            23.445918
## poly(horsepower, 3)1 -120.137744
## poly(horsepower, 3)2   44.089528
## poly(horsepower, 3)3   -3.948849

Те же прогнозы

Важно отметить, что поскольку столбцы в poly(horsepwer, 2) являются просто линейными комбинациями столбцов в poly(horsepower, 2, raw = TRUE), две квадратичные модели (ортогональные и необработанные) представляют одинаковые модели (т.е. они дают одинаковые прогнозы) и отличаются только параметризацией. Например, установленные значения одинаковы:

all.equal(fitted(fm2), fitted(fm2raw))
## [1] TRUE

Это также относится к необработанным и ортогональным кубическим моделям.

Ортогональность

Мы можем проверить, что у многочленов есть ортогональные столбцы, которые также ортогональны пересечению:

nr <- nrow(Auto)
e <- rep(1, nr) / sqrt(nr) # constant vector of unit length
p <- cbind(e, poly(Auto$horsepower, 2))
zapsmall(crossprod(p))
##   e 1 2
## e 1 0 0
## 1 0 1 0
## 2 0 0 1

Остаточная сумма квадратов

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

crossprod(model.matrix(fm3)[, 4], Auto$mpg)^2
##         [,1]
## [1,] 15.5934

deviance(fm2) - deviance(fm3) # same
## [1] 15.5934

anova(fm2, fm3) # same value found on last line
## 
## Analysis of Variance Table
## 
## Model 1: mpg ~ poly(horsepower, 2)
## Model 2: mpg ~ poly(horsepower, 3)
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    389 7442.0                           
## 2    388 7426.4  1    15.593 0.8147 0.3673

Ответ 3

Быстрый ответ заключается в том, что poly вектора x по существу эквивалентен QR-разложению матрицы, столбцы которой имеют степень x (после центрирования). Например:

> x<-rnorm(50)
> x0<-sapply(1:5,function(z) x^z)
> x0<-apply(x0,2,function(z) z-mean(z))
> x0<-qr.Q(qr(x0))
> cor(x0,poly(x,5))
                 1             2             3             4             5
[1,] -1.000000e+00 -1.113975e-16 -3.666033e-17  7.605615e-17 -1.395624e-17
[2,] -3.812474e-17  1.000000e+00  1.173755e-16 -1.262333e-17 -3.988085e-17
[3,] -7.543077e-17 -7.778452e-17  1.000000e+00  3.104693e-16 -8.472204e-17
[4,]  1.722929e-17 -1.952572e-16  1.013803e-16 -1.000000e+00 -1.611815e-16
[5,] -5.973583e-17 -1.623762e-18  9.163891e-17 -3.037121e-16  1.000000e+00