R函数`poly`真的有用吗?

时间:2013-10-20 23:22:24

标签: r

我已阅读手册页?poly(我承认我并未完全理解),并阅读了书Introduction to Statistical Learning中对该功能的描述。

我目前的理解是,对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到底在做什么?

3 个答案:

答案 0 :(得分:39)

要获得普通多项式,请使用问题raw = TRUE。不幸的是,回归中的普通多项式存在不希望的方面。如果我们拟合二次方,比方说,然后是一个三次方,则立方的低阶系数都不同于二次方,即二次方的56.900099702,-0.466189630,0.001230536与6.068478e + 01,-5.688501e-01, 2.079011e-03用以下立方体改装后。

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

答案 1 :(得分:30)

当在统计模型中引入多项式项时,通常的动机是确定响应是否是“弯曲的”以及当加入该项时曲率是否“显着”。投掷+I(x^2)的结果术语是,小的偏差可能会因拟合过程的位置而被“放大”,并且当它们只是一端或另一个数据范围的波动时,由于曲率项而被误解。这导致不恰当地分配“重要性”的声明。

如果你只是用I(x^2)投入一个平方项,必然它至少在x > 0的域中与x高度相关。相反使用: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为中心,线性项已向下移动,因此在相同的x点处为0(模型中隐含的(Intercept)项依赖于将所有项都移回当时要求预测。)

答案 2 :(得分:15)

快速回答是,向量的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