因子分析の適合度検定     Last modified: Mar 28, 2008

目的

因子分析の結果(因子数,独自性)に対して適合度検定を行う
(最尤法でなければ適合度検定ができないと思っていたが,
必要なのは抽出した因子数と分析結果のうちの独自性ベクトル
だけであるらしい。
ならば,どんな因子分析の結果についてでも適合度の検定を
行うことができる。)

使用法

fa.fit.test <- function(data, factors, uniquenesses)


引数

data           データ行列(データフレーム)
factors        抽出した因子数
uniquenesses   独自性ベクトル

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/fa.fit.test.R", encoding="euc-jp")

# 因子分析の適合度検
fa.fit.test <- function(data,                                        # データ行列(データフレーム)
                        factors,                                # 抽出した因子数
                        uniquenesses)                           # 独自性ベクトル
{
        p <- ncol(data)                                              # 変数の個数
        n <- nrow(data)                                              # ケース数
        r <- cor(data)                                               # 相関係数行列
        sc <- diag(1/sqrt(uniquenesses))                     # 
        r <- sc%*%r%*%sc                                     # 
        e <- eigen(r, symmetric=TRUE, only.values=TRUE)              # 固有値だけ求める
        e <- e$values[-(1:factors)]                          # 抽出された因子で説明されない部分
        s <- -sum(log(e)-e)+factors-p                                # 統計量
        chisq <- (n-1-(2*p+5)/6-(2*factors)/3)*s             # カイ二乗統計量に変換
        df <- ((p-factors)^2-p-factors)/2                    # 自由度
        P <- pchisq(chisq, df, lower.tail=FALSE)             # P 値
        return(c(Chi.sq.=chisq, df=df, P=P))                    # 名前付ベクトルで返す
}


使用例

> dat <- read.table("pfa.data", header=TRUE)	# ファイルからデータを読んだ
> dat
   var1 var2 var3 var4 var5 var6 var7 var8 var9 var10
1   935  955  926  585 1010  925 1028  807  769   767
2   817  905  901  632 1004  950  957  844  781   738
3   768  825  859  662  893  900  981  759  868   732
4   869  915  856  448  867  874  884  802  804   857
5   787  878  880  592  871  874  884  781  782   807
6   738  848  850  569  814  950  957  700  870   764
7   763  862  839  658  887  900 1005  604  709   753
8   795  890  841  670  853  874  859  701  680   772
9   903  877  919  460  818  849  884  700  718   716
10  761  765  881  485  846  900  981  728  781   714
11  747  792  800  564  796  849  932  682  746   767
12  771  802  840  609  824  874  859  668  704   710
13  785  878  805  527  911  680  884  728  709   747
14  657  773  820  612  810  849  909  698  746   771
15  696  785  791  578  774  725  932  765  706   795
16  724  785  870  509  746  849  807  763  724   760
17  712  829  838  516  875  725  807  754  762   585
18  756  863  815  474  873  725  957  624  655   620
19  622  759  786  619  820  769  807  673  698   695
20  668  753  751  551  834  849  807  601  655   642
> ans <- factanal(dat, 4)	# R の関数を使って分析(デフォルトはバリマックス回転)
> ans

Call:
factanal(x = dat, factors = 4)

Uniquenesses:	# 必要な情報の一つ $uniquenesses に入っている
 var1  var2  var3  var4  var5  var6  var7  var8  var9 var10
0.005 0.187 0.236 0.595 0.005 0.005 0.644 0.005 0.467 0.574

Loadings:
      Factor1 Factor2 Factor3 Factor4
var1   0.820   0.200   0.347  -0.402
var2   0.856   0.204          -0.178
var3   0.559   0.454   0.472  -0.151
var4                   0.112   0.627
var5   0.891   0.174  -0.151   0.385
var6   0.231   0.169   0.877   0.379
var7   0.500           0.263   0.190
var8   0.284   0.955
var9   0.105   0.580   0.376   0.211
var10          0.452   0.432  -0.188

               Factor1 Factor2 Factor3 Factor4
SS loadings      2.907   1.799   1.552   1.021
Proportion Var   0.291   0.180   0.155   0.102
Cumulative Var   0.291   0.471   0.626   0.728

Test of the hypothesis that 4 factors are sufficient.
The chi square statistic is 15.16 on 11 degrees of freedom.
The p-value is 0.175
> fa.fit.test(dat, 4, ans$uniquenesses)	# 適合度の検定だけを行う
   Chi.sq.         df          P	# factanal 関数の出力と同じである
15.1635725 11.0000000  0.1751303


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh