お薦めHP:

RjpWiki
  (Rでエコノメトリクス)

R-Tips

Econometrics in R

EconWiki R

Statistics with R

Rで国際金融

A Brief Guide to R for Beginners in Econometrics

金明哲さんのHP

Atsushi Matsumoto's Website #Materials for R

石田基広さんのHP

久保拓弥さんのHP

R Graphical Manual

Japan.R (勉強会)

Tokyo.R (勉強会)

Tsukuka.R (勉強会)

Nagoya.R (勉強会)


1.基本概念
 因子分析(factor analysis)は多くの変数により記述された量的データの分析方法である。 また因子分析で扱うデータの形式は主成分分析と基本的には同じであることから、同じ場面に利用されることが多い。 主成分分析では変数の間の相関関係を用いて、無相関の合成変数を求めることで多くの変数を少ない変数に縮約するが、因子分析は変数の間の相関関係から共通因子(common factor)を求めることで、多くの変数を少数個の共通因子にまとめて説明することを目的としている。 因子分析は観測データにおける変数の間の関連成分をまとめたものを共通因子と呼び、他の変数と関係がなく、その変数のみ持っている成分を独自因子(unique factor)と呼ぶ。 よって因子分析では観測データはお互いに関連性を持っており、共通因子と独自因子に分解できることを前提としている。

 例: 表1のような観測データが図1に示すように 個の共通因子と独自因子により構成されたとすると、式1のようなモデルで表現できる。  
表1 データ行列 Xm×n
    x1 x2 xj xn
個体 1 x11 x12 x1j x1n
個体 2 x21 x22 x2j x2n
個体 i xi1 xi2 xij xin
個体 m xm1 xm2 xmj xmn
xi1=a11fi1+a12fi2+…+a1kfik+ei1
xi2=a21fi1+a22fi2+…+a2kfik+ei2
       ・・・
xij=aj1fi1+aj2fi2+…+ajkfik+eij  (式1)
       ・・・
xin=an1fi1+an2fi2+…+ankfik+ein
    i=1,2,・・・,m

 式の中のfikを共通因子fkの個体iの因子得点(factor score)と呼び、共通因子の係数を因子負荷量(factor loading)と呼ぶ。 表2に因子負荷量、表3にそれに対応する因子得点を示す。
 
表2 因子負荷量行列 An×k
   因子負荷量
第1 第2 第k
xi1 a11 a12 a1k
xi2 a21 a22 a2k
xij aj1 aj2 ajk
xn1 an1 an2 ank
 
表3 因子得点行列 Fm×k
   因子得点
第1 第2 第k
個体 1 f11 f12 f1k
個体 2 f21 f22 f2k
個体 i fj1 fj2 fjk
個体 m fn1 fn2 fnk

 因子分析では式1からAn×k、Fn×kを求めるのが主な課題である。 式1の左側は観測・測定によって得られたデータで右側は共通因子と因子負荷量の線形結合に独自因子を加えている。 右側の各要素を求めることは比較的に複雑であり、何らかの条件の仮定が必要である。 異なる仮定のもとでいくつかのアルゴリズムが提案されている。 その中で最も広く用いられているのは主因子法(反復法)最尤法である。 主因子法は安定した結果が得られるが、データが正規分布に従うときには最尤法を用いた方がよいと言われている。そのため異なるアルゴリズムから求められた結果を比較することは意味をなさない。

2.関数と使用例
最尤法による因子分析の関数factanalが実装されている。

factanal(x,factors,rotation,scores,…)

 引数のxはデータセットで、factorsは求める因子の数である。因子の数は解析を行う際に指定しなければならない。主成分分析の結果から因子の数を決めると良い。 また引数rotationではバリマックス(varimax)回転とプロマックス(promax)回転を指定することができる。デフォールトには、直交回転“varimax”になっている。 そして引数scoresでは、因子得点を求める方法として、回帰方法(regression)とバートレット法(Bartlett)の中から1つ選択する。デフォールトには“none”になっているので、特別な方法を指定しないと、因子得点は求めない。 関数factanalが返す主な値として次がある。
 $loadings 因子負荷量
 $correlation 相関係数
 $factors 求めた因子数
 $STATISTIC カイ2乗値
 $dof カイ2乗決定の自由度
 $PVAL カイ2乗統計量のP値

バリマックス解
 主成分分析と同様のデータを使用する。
 
> set.seed(123)
> x<-matrix(rnorm(100),ncol=5)
> colnames(x)<-paste("X",1:5,sep="")

相関係数行列は次のようになる (round関数により小数点以下3桁にそろえている)。
 
> round(cor(x),3)
       X1     X2     X3     X4     X5
X1  1.000 -0.092 -0.125  0.122 -0.227
X2 -0.092  1.000  0.098  0.230  0.366
X3 -0.125  0.098  1.000 -0.148 -0.348
X4  0.122  0.230 -0.148  1.000 -0.126
X5 -0.227  0.366 -0.348 -0.126  1.000

このデータに対してバリマックス回転を行い、因子得点を求める。 抽出する因子数(factors引数)については解析結果の最後に示される因子数の十分正の検定結果や因子負荷量の2乗和が1以上になるものがないことを確認する必要がある。
 
> ans<-factanal(x,factors=2,scores="regression")
> ans

Call:
factanal(x = x, factors = 2, scores = "regression")

Uniquenesses:
   X1    X2    X3    X4    X5 
0.901 0.807 0.005 0.942 0.005 

Loadings:
   Factor1 Factor2
X1         -0.300 
X2          0.436 
X3  0.992   0.100 
X4 -0.129  -0.203 
X5 -0.441   0.895 

               Factor1 Factor2
SS loadings      1.208   1.132
Proportion Var   0.242   0.226
Cumulative Var   0.242   0.468

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 2.35 on 1 degree of freedom.
The p-value is 0.126 

変数と因子の関係を把握するために次のような図を作成する。
 
plot(ans$loadings[,1],ans$loadings[,2],asp=1)
 50 件以上の警告がありました (警告を見るには warnings() を使って下さい) 
> abline(h=0,v=0)
> text(ans$loadings[,1],ans$loadings[,2],labels=paste("X",1:5,sep=""),pos=3)


また因子得点はfactanal関数のscores引数で"regression"または"Bartleft"を指定した場合にはscoresという名前の要素に付値されるので、以下のようにして求められる。
 
> ans$scores
          Factor1    Factor2
 [1,] -0.75065366 -0.8636259
 [2,] -0.31407240 -0.1392499
 [3,] -1.27095852 -1.6242378
 [4,]  2.01941095  1.3452687
 [5,]  1.17651000 -0.2225578
 [6,] -1.22395908 -0.6656475
 [7,] -0.60271376  0.6726268
 [8,] -0.57739306 -0.1984156
 [9,]  0.76210891 -0.5687796
[10,] -0.29127423  0.8956500
[11,]  0.06434394  0.8584363
[12,] -0.15584741  0.1569120
[13,] -0.13081248 -0.2445360
[14,]  1.39235473 -0.6565770
[15,] -0.45892812  1.0989304
[16,]  1.53217440 -0.5574305
[17,] -1.88853490  1.5022855
[18,]  0.32655534  1.7126546
[19,]  0.09688342 -0.7717777
[20,]  0.29480594 -1.7299290

因子得点についても以下のように2つの因子の組み合わせで図を作成すると良い。
 
> plot(ans$score[,1],ans$score[,2],asp=1)
> abline(h=0,v=0)
> text(ans$score[,1],ans$score[,2],labels=1:20,pos=3)



プロマックス解
 バリマックス解は因子軸が直行するが、 因子軸が直行するということは因子間の相関がないことを意味する。 これに対して因子軸が直行しない(斜交する)とする因子分析もある。

 
> ans2<-factanal(x,factors=2,rotation="promax")
> print(ans2,sort=TRUE,cutoff=0)

Call:
factanal(x = x, factors = 2, rotation = "promax")

Uniquenesses:
   X1    X2    X3    X4    X5 
0.901 0.807 0.005 0.942 0.005 

Loadings:
   Factor1 Factor2
X5  0.982  -0.204 
X3 -0.178   0.987 
X1 -0.262  -0.168 
X2  0.404   0.161 
X4 -0.160  -0.175 

               Factor1 Factor2
SS loadings      1.254   1.100
Proportion Var   0.251   0.220
Cumulative Var   0.251   0.471

Factor Correlations:
        Factor1 Factor2
Factor1  1.0000  0.0281
Factor2  0.0281  1.0000

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 2.35 on 1 degree of freedom.
The p-value is 0.126 


因果負荷量を全部書き出して(cutoff=0), 因果負荷量の順に並べる(sort=TURE)

 
> sort.loadings<-function(x)
+ {
+ y<-abs(x$loadings)
+ z<-apply(y,1,which.max)
+ lno<-NULL
+ s<-0
+ for(i in 1:ncol(y)){
+ t<-order(y[z==i,i],decreasing=TRUE)
+ lno<-c(lno,s+t)
+ s<-s+length(t)
+ }
+ loadings<-x$loadings[lno,]
+ class(loadings)<-"loadings"
+ return(loadings)
+ }
> print(sort.loadings(ans2),cutoff=0)

Loadings:
   Factor1 Factor2
X3 -0.178   0.987 
X2  0.404   0.161 
X1 -0.262  -0.168 
X4 -0.160  -0.175 
X5  0.982  -0.204 

               Factor1 Factor2
SS loadings      1.254   1.100
Proportion Var   0.251   0.220
Cumulative Var   0.251   0.471


因子間相関関数

プロマックス回転は斜交回転のため因子間に相関が0ではない。 因子間の相関係数行列はfactanal関数では直接求めることができないため、 次のような関数を定義すると良い。

 
> factor.correlation<-function(x,factors)
+ {
+ ans<-factanal(x,factors,rotation="none")
+ ans2<-promax(ans$loadings)
+ ans3<-ans2$rotmat
+ r<-solve(t(ans3) %*% ans3)
+ colnames(r)<-rownames(r)<-colnames(ans2$loadings)
+ return(list(loadings=ans2$loadings,r=r))
+ }


factor.correlation関数は、x引数にデータフレーム、factorsに抽出する因子数を指定して呼び出すことで、因子間相関係数行列とプロマックス解による因子負荷量行列を返す。

 
> factor.correlation(x,2)
$loadings

Loadings:
   Factor1 Factor2
X1  0.168  -0.262 
X2 -0.161   0.404 
X3 -0.987  -0.178 
X4  0.175  -0.160 
X5  0.204   0.982 

               Factor1 Factor2
SS loadings       1.10   1.254
Proportion Var    0.22   0.251
Cumulative Var    0.22   0.471

$r
            Factor1     Factor2
Factor1  1.00000000 -0.02814076
Factor2 -0.02814076  1.00000000


Back to R

Google


R 関連図書:


【初級編】 基本事項

【中級編】 Iの応用編

【初級編】 基本事項 [HP]

【初級編】 基本事項 [HP]

【中級編】 グラフィックス [HP]

【中級編】 いろいろ

【中級編】 計量経済学

【中級編】 計量経済学

【中級編】 計量経済学

【中級編】 計量経済学 [HP]

【中級編】 多次元データ一般

【中級編】 計量経済学 [HP]

【中級編】 時系列

【中級編】 時系列

【中級編】 ベイズ統計

【中級編】 ベイズ統計

【中級編】 ベイズ統計

【中級編】 ベイズ統計を用いたマーケティング

【中級編】 マーケティング

【中級編】 テキストマイニング [HP]

【中級編】 ネットワーク

【中級編】 パターン認識

【中級編】 マシーンラーニング

【中級編】 モンテカルロ法、ブートストラップ、MCMCなど [HP]