No.02248 因子負荷量と寄与率  【Suzuki】 2007/01/13(Sat) 18:45

http://aoki2.si.gunma-u.ac.jp/R/prcomp2.html
のデータ(dat)について,因子負荷量(各主成分の得点と元の各変数の値との間の相関係数)を以下のように計算しましたが,ホームページの値と一致しません。
> result = prcomp(dat)
> cor(dat, result$x)
PC1 PC2 PC3 PC4 PC5
Var.1 0.9595643 -0.22968270 0.01162062 -0.063722313 0.1492871
Var.2 -0.3216384 -0.36299435 0.30309256 0.751113234 0.3297691
Var.3 -0.6850756 -0.05842143 0.36201602 -0.442788798 0.4473711
Var.4 -0.2955386 -0.92000186 0.09232042 -0.114058737 -0.2114735
Var.5 0.3370288 0.23438079 0.88470021 0.001453964 -0.2208635

また,寄与率の値も一致しません。
> summary(result)$importance["Proportion of Variance",]
PC1 PC2 PC3 PC4 PC5
0.47078 0.21216 0.15588 0.09500 0.06618

アドバイスをよろしくお願い致します。

No.02249 Re: 因子負荷量と寄与率  【青木繁伸】 2007/01/13(Sat) 19:05

違いをもたらす理由
一つは,データを正規化するかどうか prcomp(..., scale=TRUE/FALSE, ...)
もう一つは,prcomp は主成分負荷量ではなく,固有ベクトル(重み)を返すこと

後者については,http://aoki2.si.gunma-u.ac.jp/R/prcomp2.html
戻り値のリスト

prcomp が返すもの
$sdev 固有値
$rotation 固有ベクトル(いわゆる負荷量ではない)
$center 分析に使用した各変数の平均値
$scale 分析に使用した各変数の標準偏差(変動をデータの個数で割って平方根を取った方)
$x 主成分得点(不偏分散が固有値になるように調整されているもの)

付加されたもの
$loadings 整形された主成分分析結果(下記参照)
$scores 主成分得点(ただし,分散が固有値になるように調整したもの)

# プログラムを読むのは面倒くさいけど,どこが違うか知るためには仕方ない
# プログラム仕様書(必要なことが全部書かれているわけではないが,それもしょうがない)

No.02253 Re: 因子負荷量と寄与率  【青木繁伸】 2007/01/13(Sat) 19:38

仕様書・説明を再確認してください。
prcomp2 で正規化するのは,cor=TRUE です。
> prcomp2(dat, pcs=5, cor=TRUE)
PC1 PC2 PC3 PC4 PC5 Contribution
Var.1 -0.767 0.448 -0.151 -0.213 0.378 1.000
Var.2 0.530 0.618 0.144 0.548 0.127 1.000
Var.3 0.750 -0.249 0.387 -0.323 0.348 1.000
Var.4 0.557 0.557 -0.324 -0.489 -0.188 1.000
Var.5 -0.357 0.302 0.848 -0.170 -0.185 1.000
Eigen.values 1.869 1.047 1.017 0.718 0.350
Proportion 37.375 20.932 20.342 14.354 6.998
Cumulative.prop. 37.375 58.306 78.648 93.002100.000

# なお,R では T も F も定数ではないので,TRUE/FALSE 以外の値をセットすることができてしまいます。従って,true/false を表すためには常に TRUE/FALSE と書きましょう

No.02256 Re: 因子負荷量と寄与率  【Suzuki】 2007/01/13(Sat) 19:51

コメントありがとうございます。
標準化しないデータ(分散共分散行列)を用いた場合の主成分分析をprcomp2で実行したところ,PC1におけるVar.1の因子負荷量が1を超え(1.467),PC5までの累積寄与率が100%を超えました(120.893)。
# prcomp2の結果
> prcomp2(dat, pcs=5, cor=FALSE)
PC1 PC2 PC3 PC4 PC5 Contribution
Var.1 1.467 -0.351 0.018 -0.097 0.228 2.339
Var.2 -0.263 -0.297 0.248 0.615 0.270 0.671
Var.3 -0.639 -0.055 0.338 -0.413 0.417 0.871
Var.4 -0.324 -1.007 0.101 -0.125 -0.232 1.199
Var.5 0.331 0.230 0.869 0.001 -0.217 0.966
Eigen.values 2.846 1.282 0.942 0.574 0.400
Proportion 56.914 25.648 18.844 11.485 8.001
Cumulative.prop. 56.914 82.563101.407112.891120.893

# prcompの結果
> result = prcomp(dat, scale=FALSE)
> cor(dat, result$x)
PC1 PC2 PC3 PC4 PC5
Var.1 0.9595643 -0.22968270 0.01162062 -0.063722313 0.1492871
Var.2 -0.3216384 -0.36299435 0.30309256 0.751113234 0.3297691
Var.3 -0.6850756 -0.05842143 0.36201602 -0.442788798 0.4473711
Var.4 -0.2955386 -0.92000186 0.09232042 -0.114058737 -0.2114735
Var.5 0.3370288 0.23438079 0.88470021 0.001453964 -0.2208635
> summary(result)$importance["Cumulative Proportion",]
PC1 PC2 PC3 PC4 PC5
0.47078 0.68294 0.83882 0.93382 1.00000

No.02257 Re: 因子負荷量と寄与率  【青木繁伸】 2007/01/13(Sat) 19:54

混乱しているようですね。
はい。私のプログラムにも問題があるようです。
あとで,修正しておきます。
正規化しない状態の主成分分析については十分検討しておりませんでした。
正規化しないデータを主成分分析したときに因子負荷量行列に示されるのは分散共分散になるのかな?
だったら,1を超えようが,何の問題もない。
いっそのこと,正規化しないで分析することができないようにしてしまう方がすっきりする。
普通,正規化しないで(分散共分散行列を対象にして)主成分分析するような場合は,特殊な状況なのだから(単位が同じであっても,等分散でない行列を主成分分析してどのような意味づけができるのか)。

No.02272 Re: 因子負荷量と寄与率  【青木繁伸】 2007/01/13(Sat) 22:52

分散共分散行列から出発する場合の主成分分析(prcomp2, princomp2)において,主成分の寄与率を計算する分母が変数の個数(正規化した変数の分散共分散行列(相関係数行列だ)の対角成分の和)になって いたので,寄与率(累積寄与率)が100%を超えることになっていた。それはなおした。

しかし,もとになる princomp と prcomp で,出発する分散共分散行列の定義が違う。なんたること。n で割っているか n-1 で割っているかで,n が大きくなればたいした問題ではないのだが。

ますます,分散共分散行列を対象にする主成分分析はできなくしてしまいたくなる。

No.02275 Re: 因子負荷量と寄与率  【Suzuki】 2007/01/14(Sun) 03:55

青木さん,ありがとうございます。対応分析においても因子負荷量は利用されるのでしょうか。
http://gucchi24.hp.infoseek.co.jp/SHUSEI.htmは,「主成分負荷量=もとのデータと主成分得点との相関係数」と定義しています。この定義に従えば,分散共分散行列から主成分を求めた時も,主成分負荷量は1を超えません(相関係数は-1から1までの範囲をとるので)。
result = prcomp2(dat, cor=FALSE)
cor(dat, result$score)
また,「主成分負荷量と固有値との関係」は「分散共分散行列から主成分を求めた時」と「相関行列から主成分を求めた時」とで異なると述べています。
「分散共分散行列から主成分を求めた時」
  「主成分負荷量」=「固有値の平方根」と「固有べクトル」をかけた値を「説明変量の分散」で除した値
「相関行列から主成分を求めた時」
  「主成分負荷量」=「固有値の平方根」と「固有べクトル」をかけた値

No.02278 Re: 因子負荷量と寄与率  【青木繁伸】 2007/01/14(Sun) 08:37

よくご存じのようなので,こちらが教えて欲しいと思います

因子負荷量行列は,相関係数行列の分解なのかスタートとなった行列の分解なのかどちらなんでしょう。
> dat <- matrix(c(	# 10 ケース,5 変数のデータ行列例(ファイルから読んでも良い)
+ -1.89, -0.02, 0.42, 1.23, -1.53,
+ 0.06, 1.81, -0.59, -0.75, -0.12,
+ 2.58, -0.20, -1.92, -0.49, -0.35,
+ 0.69, -0.66, -0.77, -1.92, 0.38,
+ -1.05, 0.07, -0.37, -0.89, -1.62,
+ -2.73, 1.40, 0.18, -0.09, 0.13,
+ 0.95, 0.84, 1.19, 1.19, 0.10,
+ 0.93, 1.17, -1.70, 1.46, -0.25,
+ -0.04, -0.12, -0.34, -0.24, 1.88,
+ 0.16, 1.03, -0.05, -0.73, 0.04
+ ), byrow=TRUE, ncol=5)
> colnames(dat) <- paste("Var", 1:5, sep=".") # 変数名
> rownames(dat) <- paste("case", 1:10, sep="-") # ケース名
> result <- prcomp2(dat, pcs=5, cor=FALSE, score=TRUE, verbose=FALSE)
> fl <- result$loadings[1:5,1:5] # 因子負荷量の部分
> fl %*% t(fl) # これと
Var.1 Var.2 Var.3 Var.4 Var.5
Var.1 2.3385156 -0.275991111 -0.77735556 -0.1599133 0.370882222
Var.2 -0.2759911 0.670728889 0.12703333 0.2704289 0.002353333
Var.3 -0.7773556 0.127033333 0.87078333 0.2508611 -0.021788889
Var.4 -0.1599133 0.270428889 0.25086111 1.1987789 -0.201235556
Var.5 0.3708822 0.002353333 -0.02178889 -0.2012356 0.965826667
> var(dat) # これが,同じになる
Var.1 Var.2 Var.3 Var.4 Var.5
Var.1 2.3385156 -0.275991111 -0.77735556 -0.1599133 0.370882222
Var.2 -0.2759911 0.670728889 0.12703333 0.2704289 0.002353333
Var.3 -0.7773556 0.127033333 0.87078333 0.2508611 -0.021788889
Var.4 -0.1599133 0.270428889 0.25086111 1.1987789 -0.201235556
Var.5 0.3708822 0.002353333 -0.02178889 -0.2012356 0.965826667

● 「統計学関連なんでもあり」の過去ログ--- 039 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る