Rで主成分回帰分析を行う方法
概要
主成分回帰分析pCR は、主成分分析と多重回帰分析を組み合わせたもので、主成分分析によって得られた主成分を新しい独立変数として設定した回帰分析です。統計学の観点からすると、主成分分析自体は特に必要ではなく、通常は回帰分析に使用される時に意味があります。
実践
(多重共線性を見つける方法の続きで)
主成分を作り出す過程は行列分解を含む複雑な計算を伴いますが、Rではprcomp()
関数を通じて簡単に求めることができます。
- (1) 回転: 実際に元の独立変数に乗じて主成分を作る係数を示します。例えば、PC1を作るためには、populationに$-0.098$、whiteに$0.056$、…、povertyに$-0.187$を乗じて全部合わせて作ります。また、データによっては、どの主成分がどの変数に関する情報を多く持っているかを一目で確認できる指針にもなります。
- (2) 成分の重要度: 文字通り、各主成分の重要度を示します。Proportion of Varianceが高いほど、データの多くの部分を説明しており、それだけ重要な主成分であるという意味になります。これを視覚的に示したものが右のScree Plotです。Scree plotは、ただplot()関数に主成分分析の結果を入れるだけで簡単に描画できます。この図を通じて、主成分をどこまで使用するかを決定します。
- (3) Elbow Point: Scree plotで急激に勾配が変わる点で、この点以降は主成分を使っても得られる利益が少なくなる部分を示します。Elbow point以降の主成分は分析に使用しなくても特に問題ありません。例の場合では、PC1, PC2, PC3までを使用することが望ましいでしょう。
しかし、最終的にこれをどうやって回帰分析に入れるかが問題です。独立変数を回転と乗算してPCを作り、回帰分析をした後、元の独立変数に対する式を立てることはかなり面倒な作業です。そのため、plsパッケージのpcr()
関数を使用してみましょう。
summary()
関数を通じて出力された結果では、いくつかの主成分を使用した場合にcollgeGrad
をどれぐらい説明するかがわかります。
上記の主成分分析から、$3$個の主成分で十分でした。jack.test()
関数のncomp
オプションに3
を入れて実行してみると、主成分に対する回帰係数ではなく、元の独立変数に対する回帰係数を教えてくれるだけでなく、t検定も一度に行ってくれます。
また、右の残差図を見ると特に問題はなさそうです。
win.graph(4,4); plot(scale(PCRout$residuals[,,3]),main="Residual")
잔차그림을 출력할 때 주의할 것은 pcr()
함수가 반환하는 결과에 $residuals
を参照することで得られるのは正しいが、主成分をいくつ使用したかによって、残差が3次元配列で含まれるということです。この例では、[,,3]でスライシングして、主成分が3つまで使用されたPCRの残差を参照しました。分析でk個の主成分を使用した場合は、[,,k]のようにスライシングする必要があります。
コード
以下は例示コードです。
install.packages('pls')
install.packages('car')
library(pls)
library(car)
X<-MplsDemo[,-1]
Y<-X[,7]; X<-X[,-7]
PCAout<-prcomp(X[,-7],center=T,scale.=T); PCAout; summary(PCAout)
win.graph(3,3); plot(PCAout, type='l',main="screeplot")
PCRout<-pcr(collegeGrad~.,data=MplsDemo[,-1],validation="LOO",jackknife=T)
summary(PCRout)
jack.test(PCRout,ncomp=3)
win.graph(4,4); plot(scale(PCRout$residuals[,,3]),main="Residual")