多変量解析入門 ~ 次の半歩:因子分析、マハラノビスの距離 (R言語) ~:年代記4
価格: ¥0
[学習要綱]
-因子分析
-共通性導出(主たる講義)
-主因子法
-SMC法
-Rで実装
-関数利用
-マハラノビスの距離
-考え方(主たる講義)
-公式導出
-Rで実装
-関数利用
*判別分析は対象外
[利用するデータ] 要コピペ。文字化け対策としてUTF-8で保存すること
-因子分析
数学,国語,物理
90,40,80
85,50,75
75,55,70
50,85,60
40,95,45
55,80,55
50,95,30
項目1,項目2,項目3,項目4,項目5,項目6
8,7,6,9,8,10
10,8,8,7,7,6
7,7,6,9,8,8
6,7,6,8,6,7
4,9,8,9,8,7
1,1,2,5,5,6
2,2,3,4,5,2
2,2,3,2,3,1
3,4,5,2,1,1
2,1,3,3,3,4
-マハラノビスの距離
x,y
50,55
60,65
70,75
80,85
90,95
100,105
65,60
75,70
85,80
95,90
60,70
70,80
80,90
90,100
[マハラノビスの距離]
-実装:紙面の関係上、平均値0を仮定
#求める距離の座標
x <- 20
y <- 10
#csvデータ読み込み
data <- read.csv("data.csv",fileEncoding="UTF-8",header=T )
#平均値保存
ave <- c ( mean ( data [ , 1 ] ) , mean ( data [ , 2 ] ) )
#平均値を0にする
data [ , 1 ] <- data [ , 1 ] - ave [ 1 ]
data [ , 2 ] <- data [ , 2 ] - ave [ 2 ]
#求める距離の座標(平均値を減算)
point <- c ( x - ave [ 1 ] , y - ave [ 2 ] )
#固有値
data_var <- var ( data )
e <- eigen ( data_var )
#基底変換
point_new <- point %*% e$vectors
#各座標を標準化
d_x <- point_new [1] / sqrt ( e$values[1] )
d_y <- point_new [2] / sqrt ( e$values[2] )
#各座標を2乗して加算
print ( d_x^2 + d_y^2 )
-公式導出(参考程度:本文は見やすく記述している)
固有値1,2 = p1 , p2
各ベクトル
| p11 p21 |
| p12 p22 |
#平均値0を仮定
距離2 = ( p11x + p12y )2 / p1 + ( p21x + p22y )2 / p2
#p11x + p12y = a
#p21x + p22y = b
a2/p1 + b2/p2
#ベクトル化
| a b | %*%
| a/p1 |
| b/p2 |
=
| a b | %*%
| 1/p1 0 | %*%
| 0 1/p2 |
| a |
| b |
・・・①
#別の話
#| a b |を元に戻す
| a b |
=
| p11x + p12y p21x + p22y |
#ベクトル化
| x y | %*%
| p11 p21 |
| p12 p22 |
・・・②
#別の話
#| a b |Tを元に戻す
| a |
| b |
=
| p11x + p12y |
| p21x + p22y |
#ベクトル化
| p11 p12 | %*%
| p21 p22 |
| x |
| y |
・・・③
#①の式に②と③を代入
| x y | %*%
| p11 p21 | %*%
| p12 p22 |
| 1/p1 0 | %*%
| 0 1/p2 |
| p11 p12 | %*%
| p21 p22 |
| x |
| y |
#P=
#| p11 p21 |
#| p12 p22 |
#D=
#| p1 0 |
#| 0 p2 |
# D-1=
#| 1/p1 0 |
#| 0 1/p2 |
#PT=
#| p11 p12 |
#| p21 p22 |
| x y | P D-1 PT | x y |T
#Pは正則行列→PT = P-1
| x y | P D-1 P-1 | x y |T
・・・④
#別の話:行列の対角化
#Aは分散共分散
AP=PD・・・一般的に知られた式
#A-1を左からかける
A-1AP=A-1PD
P=A-1PD
#...操作省略(本文では省略していない)
PD-1P-1=A-1
#④の式に代入
| x y | A-1 | x y |T
導出終了(平均値0を仮定)