生の多項式
質問のように通常の多項式を取得するには、 を使用しますraw = TRUE
。残念ながら、回帰における通常の多項式には望ましくない側面があります。たとえば、2 次を当てはめ、次に 3 次を当てはめた場合、3 次の低次係数はすべて 2 次とは異なります。 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)
、2 次近似の列が互いに直交するようにします。3 次近似についても同様です。これは、高次の係数を追加しても低次の係数が変わらないことを保証するのに十分です。最初の 3 つの係数が、下の 2 つのセットで同じになっていることに注意してください (上では異なります)。つまり、どちらの場合も、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
同じ予測
重要なことに、の列は2 つの 2 次モデル (直交モデルと生モデル) の列の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 つの優れた特性はpoly
、列が単位長さを持ち、相互に直交する (切片列にも直交する) 行列を生成するという事実により、3 次項の追加による残差平方和の減少が単純になることです。モデル行列の 3 次列への応答ベクトルの射影の長さの 2 乗。
# these three give the same result
# 1. squared length of projection of y, i.e. Auto$mpg, on cubic term column
crossprod(model.matrix(fm3)[, 4], Auto$mpg)^2
## [,1]
## [1,] 15.5934
# 2. difference in sums of squares
deviance(fm2) - deviance(fm3)
## [1] 15.5934
# 3. difference in sums of squares from anova
anova(fm2, fm3)
##
## 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 <-- note Sum of Sq value