5.2 主成分分析
5.2.1 主成分分析 prcomp()
関数
prcomp()
は与えられたデータ行列に主成分分析を実行し,結果をクラス"prcomp"
のオブジェクトとして返す.
書式:
prcomp(x, ...)
#
クラスformula
に対するS3
メソッドprcomp(formula, data = NULL, subset, na.action, ...)
#
既定のS3
メソッドprcomp(x, retx = TRUE, center = TRUE, scale. = FALSE, tol = NULL, ...)
predict(object, newdata, ...) #
クラスprcomp
に対するS3
メソッド 引数:formula
応答変数を持たない公式で,数値変数のみを参照するdata
オプションデータフレーム(
もしくは類似物,model.frame()
参照)
で,公式formula
中の変数を含む.既定では変数はenvironment(formula)
から取ら れるsubset
オプションベクトル.データ行列x
から行(
観測値)
を選択するのに使うna.action
データがNA
を含むときの処理を指示する関数.既定ではoptions
で設定された
na.action
.未設定ならna.fail()
.「工場出荷時」既定値はna.omit() ...
他のメソッドに(
から)
渡される引数.もしx
が公式なら,scale
やtol
を指定できる
x
主成分分析のためのデータである,数値または複素数値行列(
もしくはデータフ レーム)
retx
論理値で,回転された変数を返すべきかどうかを指示するcenter
論理値で,変数を平均が0
になるように移動するかどうかを指示する.別の方法として,
x
の列数に等しいベクトルを与えても良い.この値はscale
関数に 渡されるscale
論理値で,解析前に変数を標準偏差が1
になるようにスケール化するかどうかを指示する.既定値は
S
との互換性のためにFALSE
であるが,一般的にスケー ル化が望ましい.別の方法として,x
の列数に等しいベクトルを与えても良い.この値は
scale()
関数に渡されるtol
それ以下の大きさの成分を除外すべきかどうかを指示する値.(
成分は,もしそ れらの標準偏差が第一成分の標準偏差のtol
倍以下であれば除外される)
.既定 である無指定では如何なる成分も除外されない.その他のtol
の設定としてはtol=sqrt(.Machine$double.eps}
もしくはtol=0
が考えられ,実質的に定数 値の成分を取り除くobject "prcomp"
を継承するクラスのオブジェクトnewdata
それに関する予測値を求めるオプションのデータフレームもしくは行列.もし与えられなければ,スコアが用いられる.もし元の当てはめが公式,データフ レームもしくは列名を持つ行列だったならば,
newdata
は同じ名前の列を含むべ きである.さもなければ,同じ数の列を含むべきで,同じ順序で使用される 返り値: クラス"prcomp"
のリスト.次の成分を含む:sdev
主成分の標準偏差(
つまり,共分散・相関行列の固有値の平方根であるが,実際 の計算はデータ行列の特異値分解を用いて行われるrotation
変数の負荷量行列(
つまり,列が固有値を含む行列)
.関数princomp()
は これを成分loadings
として返すx
もしretx=TRUE
なら,中心化(
要求されればスケール化)
され,rotation
行 列で回転されたデータが返される.従って,cov(x)
は対角行列diag(sdev}^2
である.公式メソッドに対しては,na.action()
で除外された値の処理にnapredict()
が使われるcenter, scale
使われた中心とスケール,もしくはFALSE
計算は
(
中心化,もしかするとスケール化された)
データ行列の特異値分解を用いて行 われ,共分散行列の固有値を使わない.これは一般的に数値精度の点で好ましい方法であ る.これらのオブジェクトのplot
メソッドは スクリープロット(screeplot)
を行う.もし0
もしくは定数値(center=TRUE
の場合)
の変数を持てば,scale=TRUE
は使うべきではない.注意: 回転行列の列の符号は任意であり,したがって主成分分析用の他のプログラムと異 なるかも知れない.
R
の構築次第でも異なり得る.関連:
biplot.prcomp(), screeplot(), princomp(), cor(), cov(), svd(), eigen()
.# 米国の犯罪検挙率データUSArrestsを使用(次の図を参照)
# このデータ中の変数の分散の大きさは非常に異なるため,スケーリングが望ましい
> prcomp(USArrests) # スケーリング無し(不適当)
Standard deviations:
[1] 83.732400 14.212402 6.489426 2.482790 Rotation:
PC1 PC2 PC3 PC4
Murder 0.04170432 -0.04482166 0.07989066 -0.99492173 Assault 0.99522128 -0.05876003 -0.06756974 0.03893830 UrbanPop 0.04633575 0.97685748 -0.20054629 -0.05816914 Rape 0.07515550 0.20071807 0.97408059 0.07232502
> prcomp(USArrests, scale = TRUE) # スケーリングあり Standard deviations:
[1] 1.5748783 0.9948694 0.5971291 0.4164494 Rotation:
PC1 PC2 PC3 PC4
Murder -0.5358995 0.4181809 -0.3412327 0.64922780 Assault -0.5831836 0.1879856 -0.2681484 -0.74340748 UrbanPop -0.2781909 -0.8728062 -0.3780158 0.13387773 Rape -0.5434321 -0.1673186 0.8177779 0.08902432
> prcomp(~ Murder+Assault+Rape,data=USArrests,scale=d TRUE) # 公式による変数指定 Standard deviations:
[1] 1.5357670 0.6767949 0.4282154 Rotation:
PC1 PC2 PC3
Murder -0.5826006 0.5339532 -0.6127565 Assault -0.6079818 0.2140236 0.7645600 Rape -0.5393836 -0.8179779 -0.1999436
> plot(prcomp(USArrests)) # 2主成分の分散の棒グラフ
> summary(prcomp(USArrests, scale = TRUE)) # summaryメソッド Importance of components:
PC1 PC2 PC3 PC4
Standard deviation 1.57 0.995 0.5971 0.4164 Proportion of Variance 0.62 0.247 0.0891 0.0434 Cumulative Proportion 0.62 0.868 0.9566 1.0000
> biplot(prcomp(USArrests, scale = TRUE)) # biplotメソッド(データと変数の双方をプロット)
prcomp(USArrests, scale = TRUE)
Variances 0.00.51.01.52.0
−0.2 −0.1 0.0 0.1 0.2 0.3
−0.2−0.10.00.10.20.3
PC1
PC2
Alabama Alaska
Arizona
Arkansas
California Colorado
Connecticut Delaware Florida
Georgia
Hawaii Idaho
Illinois
Indiana Iowa
Kansas Kentucky Louisiana
Maine Maryland
Massachusetts Michigan
Minnesota Mississippi
Missouri Montana
Nebraska
Nevada
New Hampshire
New Jersey New Mexico
New York North Carolina
North Dakota
Ohio Oklahoma Oregon Pennsylvania
Rhode Island South Carolina
South Dakota Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin Wyoming
−5 0 5
−505
Murder
Assault
UrbanPop Rape
米国犯罪検挙率の4主成分の分散(左)とそのbiplot図(右)