主成分回帰

Last modified: Oct 19, 2015

 重回帰分析をする際,説明変数の中に互いに相関が高い変数が含まれる場合,通常の最小2乗法 では回帰係数の推定精度が悪くなる(多重共線性)という問題がある。
 このような場合の対処法として,以下のものがある。

 主成分回帰は,どのような場合にも適用できるものではないことに注意が必要である。
 具体的には,以下のような場合に適用する。3 番目は重要(必然的に 2 番目も)。


1 主成分回帰と直線回帰の違い

 重回帰分析では,回帰超平面上の予測値と実測値の差の二乗和を最小にするという考え方をとった。
 主成分回帰では,回帰超平面に下ろした垂線の長さの二乗和を最小にするという考え方をする。

 両者の解析例の違いを示すためのテストデータを作成する。

library(MASS) 
set.seed(53) 
m <- c(50, 80) 
sd <- c(10, 5) 
d <- mvrnorm(50, m, matrix(c(1, 0.7, 0.7, 1), 2), empirical=TRUE) 
d <- t(t(d)*sd+m) 
x <- d[,1] 
y <- d[,2] 

 以下のようなデータである(最初の 6 対)。

##             x        y 
## [1,] 552.1985 483.2704 
## [2,] 551.9537 475.2877 
## [3,] 552.1223 485.4826 
## [4,] 561.5995 480.3897 
## [5,] 569.2573 488.7343 
## [6,] 531.6893 475.4973 

 Fig 1. で,赤が直線回帰,青が主成分回帰である。常に,主成分回帰直線の傾きの方が大きい。

plot(x, y, pch=19, main="Fig. 1") 
lm.ans <- lm(y~x) 
abline(lm.ans, col="red") 
a <- prcomp(d) 
r1 <- a$rotation[1,1] 
r2 <- a$rotation[2,1] 
abline(mean(y)-r2/r1*mean(x), r2/r1, col="blue") 


2 独立変数の中に相関の高いものがある場合の実例

 iris データセットを使って説明する。

 相関係数は以下のようになる。独立変数のうちに互いに相関の高いものがある。

round(cor(iris[,1:4]), 3) 
##              Sepal.Length Sepal.Width Petal.Length Petal.Width 
## Sepal.Length        1.000      -0.118        0.872       0.818 
## Sepal.Width        -0.118       1.000       -0.428      -0.366 
## Petal.Length        0.872      -0.428        1.000       0.963 
## Petal.Width         0.818      -0.366        0.963       1.000 

 重回帰分析の結果は以下のようになるが,この結果はそのまま受け入れることはできない。

lm.iris <- lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, iris) 
summary(lm.iris) 
##  
## Call: 
## lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,  
##     data = iris) 
##  
## Residuals: 
##      Min       1Q   Median       3Q      Max  
## -0.82816 -0.21989  0.01875  0.19709  0.84570  
##  
## Coefficients: 
##              Estimate Std. Error t value Pr(>|t|) 
## (Intercept)   1.85600    0.25078   7.401 9.85e-12 
## Sepal.Width   0.65084    0.06665   9.765  < 2e-16 
## Petal.Length  0.70913    0.05672  12.502  < 2e-16 
## Petal.Width  -0.55648    0.12755  -4.363 2.41e-05 
##  
## Residual standard error: 0.3145 on 146 degrees of freedom 
## Multiple R-squared:  0.8586, Adjusted R-squared:  0.8557  
## F-statistic: 295.5 on 3 and 146 DF,  p-value: < 2.2e-16 

 実は,この分析での独立変数のトレランスは以下のようになる。

(tol <- 1/diag(solve(cor(iris[,2:4])))) 
##  Sepal.Width Petal.Length  Petal.Width  
##   0.78689664   0.06623581   0.07025267 

 Petal.Length, Petal.Width のトレランスはそれぞれ 0.066,0.070 となり,一般的な基準である 0.1 より低いため多重共線性の存在が示唆される。


2.1 重回帰分析の結果

 重回帰分析による予測結果は Fig. 2 のようになる。

lm.prediction <- predict(lm.iris) 
plot(lm.prediction, iris$Sepal.Length, col=rep(c(1,2,4), each=50), pch=19, main="Fig.2") 
abline(0, 1) 


2.2 PCR 回帰の結果

library(pls) 
##  
## Attaching package: 'pls' 
##  
##  以下のオブジェクトは 'package:stats' からマスクされています:  
##  
##      loadings 
pcr.iris <- pcr(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, ncomp=3, data=iris) 
pcr.prediction <- predict(pcr.iris) 
pcr.prediction <- cbind(pcr.prediction[,,1:3]) 

 PCR 回帰の結果は以下のように示される。

summary(pcr.iris) 
## Data:    X dimension: 150 3  
##  Y dimension: 150 1 
## Fit method: svdpc 
## Number of components considered: 3 
## TRAINING: % variance explained 
##               1 comps  2 comps  3 comps 
## X               95.09    99.12   100.00 
## Sepal.Length    74.29    82.11    85.86 

 予測値の最初の部分を示す。

head(pcr.prediction) 
##    1 comps  2 comps  3 comps 
## 1 4.880974 4.987828 5.015416 
## 2 4.899464 4.717888 4.689997 
## 3 4.858013 4.789387 4.749251 
## 4 4.929821 4.808353 4.825994 
## 5 4.877276 5.041815 5.080499 
## 6 4.996961 5.360115 5.377194 

2.2.1 第 1 主成分だけを用いた分析結果(予測値)

 第 1 主成分だけを用いて予測すると Fig. 3 のようになる。

plot(pcr.prediction[,1], iris$Sepal.Length, col=rep(c(1,2,4), each=50), pch=19, xlim=c(4, 8), main="Fig. 3") 
abline(0, 1) 


2.2.2 第 1,第 2 主成分だけを用いた分析結果(予測値)

 第 1,第 2 主成分だけを用いて予測すると Fig. 4 のようになる。

plot(pcr.prediction[,2], iris$Sepal.Length, col=rep(c(1,2,4), each=50), pch=19, xlim=c(4, 8), main="Fig. 4") 
abline(0, 1) 


2.2.3 第 1 〜 第 3 主成分(全部)を用いた分析結果(予測値)

 第 1,第 2,第 3 主成分の全部を用いて予測すると Fig. 5 のようになる。

plot(pcr.prediction[,3], iris$Sepal.Length, col=rep(c(1,2,4), each=50), pch=19, xlim=c(4, 8), main="Fig. 5") 
abline(0, 1) 

 この分析結果 Fig. 5(pcr.prediction[,3])は,3 つの独立変数を用いた重回帰分析の結果 Fig. 2(lm.prediction)と,全く同じである。
 つまり,分析方法が違っても,元々のデータが持つ情報量の全部を用いれば結果は同じということである(そうでなければ話がおかしくなる。理論的に元の情報全てを抽出できない分析法は生き残れない)。

all.equal(lm.prediction, pcr.prediction[,3]) 
## [1] TRUE 

2.3 pcr 関数を使わずに分析する

 まず,重回帰分析に使った 3 つの独立変数の主成分分析を行い,それぞれの主成分得点を求める。

prcomp.ans <- prcomp(iris[,2:4]) 
prcomp.predict <- predict(prcomp.ans) # 主成分得点(prcomp.ans$x と同じ) 

 主成分得点の最初の方を示す。

round(head(prcomp.predict), 3) 
##         PC1    PC2    PC3 
## [1,] -2.592 -0.183  0.032 
## [2,] -2.543  0.311 -0.032 
## [3,] -2.654  0.117 -0.046 
## [4,] -2.461  0.208  0.020 
## [5,] -2.602 -0.281  0.044 
## [6,] -2.280 -0.621  0.020 

2.3.1 第 1 主成分得点を使った重回帰分析の結果

 第 1 主成分得点だけを使って,重回帰分析を行った結果を示す。

lm1 <- lm(iris$Sepal.Length ~ prcomp.predict[,1]) 
summary(lm1) 
##  
## Call: 
## lm(formula = iris$Sepal.Length ~ prcomp.predict[, 1]) 
##  
## Residuals: 
##      Min       1Q   Median       3Q      Max  
## -1.28826 -0.29759 -0.02007  0.28029  1.06985  
##  
## Coefficients: 
##                     Estimate Std. Error t value Pr(>|t|) 
## (Intercept)          5.84333    0.03440  169.87   <2e-16 
## prcomp.predict[, 1]  0.37123    0.01795   20.68   <2e-16 
##  
## Residual standard error: 0.4213 on 148 degrees of freedom 
## Multiple R-squared:  0.7429, Adjusted R-squared:  0.7412  
## F-statistic: 427.6 on 1 and 148 DF,  p-value: < 2.2e-16 

2.3.2 第 1,第 2 主成分得点を使った重回帰分析の結果

 第 1,第 2 主成分得点だけを使って,重回帰分析を行った結果を示す。

lm2 <- lm(iris$Sepal.Length ~ prcomp.predict[,1:2]) 
summary(lm2) 
##  
## Call: 
## lm(formula = iris$Sepal.Length ~ prcomp.predict[, 1:2]) 
##  
## Residuals: 
##      Min       1Q   Median       3Q      Max  
## -1.03052 -0.23189 -0.00612  0.21751  0.77520  
##  
## Coefficients: 
##                          Estimate Std. Error t value Pr(>|t|) 
## (Intercept)               5.84333    0.02879 202.936  < 2e-16 
## prcomp.predict[, 1:2]PC1  0.37123    0.01503  24.704  < 2e-16 
## prcomp.predict[, 1:2]PC2 -0.58457    0.07295  -8.014 3.16e-13 
##  
## Residual standard error: 0.3527 on 147 degrees of freedom 
## Multiple R-squared:  0.8211, Adjusted R-squared:  0.8186  
## F-statistic: 337.3 on 2 and 147 DF,  p-value: < 2.2e-16 

2.3.3 第 1 〜 第 3 主成分得点(全部)を使った重回帰分析の結果

 第 1 〜 第 3 主成分得点を使って,重回帰分析を行った結果を示す。

lm3 <- lm(iris$Sepal.Length ~ prcomp.predict[,1:3]) 
summary(lm3) 
##  
## Call: 
## lm(formula = iris$Sepal.Length ~ prcomp.predict[, 1:3]) 
##  
## Residuals: 
##      Min       1Q   Median       3Q      Max  
## -0.82816 -0.21989  0.01875  0.19709  0.84570  
##  
## Coefficients: 
##                          Estimate Std. Error t value Pr(>|t|) 
## (Intercept)               5.84333    0.02568 227.519  < 2e-16 
## prcomp.predict[, 1:3]PC1  0.37123    0.01340  27.697  < 2e-16 
## prcomp.predict[, 1:3]PC2 -0.58457    0.06506  -8.984 1.22e-15 
## prcomp.predict[, 1:3]PC3  0.86983    0.13969   6.227 4.80e-09 
##  
## Residual standard error: 0.3145 on 146 degrees of freedom 
## Multiple R-squared:  0.8586, Adjusted R-squared:  0.8557  
## F-statistic: 295.5 on 3 and 146 DF,  p-value: < 2.2e-16 

2.4 PCR 回帰の結果と主成分得点を使って重回帰分析をした結果の比較(先頭の10ケース)

prcomp.lm <-  cbind(predict(lm1), predict(lm2), predict(lm3)) 
head(cbind(prcomp.lm, pcr.prediction), 10) 
##                                1 comps  2 comps  3 comps 
## 1  4.880974 4.987828 5.015416 4.880974 4.987828 5.015416 
## 2  4.899464 4.717888 4.689997 4.899464 4.717888 4.689997 
## 3  4.858013 4.789387 4.749251 4.858013 4.789387 4.749251 
## 4  4.929821 4.808353 4.825994 4.929821 4.808353 4.825994 
## 5  4.877276 5.041815 5.080499 4.877276 5.041815 5.080499 
## 6  4.996961 5.360115 5.377194 4.996961 5.360115 5.377194 
## 7  4.898979 4.957293 4.894684 4.898979 4.957293 4.894684 
## 8  4.918727 4.970316 5.021245 4.918727 4.970316 5.021245 
## 9  4.903162 4.663900 4.624913 4.903162 4.663900 4.624913 
## 10 4.915514 4.784900 4.881642 4.915514 4.784900 4.881642 

 左の 3 列は主成分得点(第 1 〜 3 主成分得点)を使った重回帰分析の予測値,右の 3 列は pcr 回帰(第 1 〜 3 主成分)を使った予測値である。それぞれ対応する予測値が同じであることがわかる。
 つまり,主成分回帰と,主成分得点を用いる重回帰分析は同じだということである。