私は、問題の焦点は理論的な側面ではなく、実際的な側面、つまりRの二分データの因子分析をどのように実装するかということに焦点を当てていると思います。
最初に、2つの直交因子からの6つの変数から200の観測値をシミュレートしましょう。いくつかの中間ステップを取り、後で二分する多変量の通常の連続データから始めます。そのようにして、ピアソン相関と多項相関を比較し、連続データからの因子負荷と二分データおよび真の負荷からの因子負荷を比較できます。
set.seed(1.234)
N <- 200 # number of observations
P <- 6 # number of variables
Q <- 2 # number of factors
# true P x Q loading matrix -> variable-factor correlations
Lambda <- matrix(c(0.7,-0.4, 0.8,0, -0.2,0.9, -0.3,0.4, 0.3,0.7, -0.8,0.1),
nrow=P, ncol=Q, byrow=TRUE)
今モデルから実際のデータをシミュレートで、、人の観測変数の値である真負荷行列、潜在因子スコア、及び IID、平均0、正常エラー。X Λ F EX = Λ F+ eバツΛfe
library(mvtnorm) # for rmvnorm()
FF <- rmvnorm(N, mean=c(5, 15), sigma=diag(Q)) # factor scores (uncorrelated factors)
E <- rmvnorm(N, rep(0, P), diag(P)) # matrix with iid, mean 0, normal errors
X <- FF %*% t(Lambda) + E # matrix with variable values
Xdf <- data.frame(X) # data also as a data frame
連続データの因子分析を行います。推定負荷は、無関係な記号を無視した場合の真の負荷に似ています。
> library(psych) # for fa(), fa.poly(), factor.plot(), fa.diagram(), fa.parallel.poly, vss()
> fa(X, nfactors=2, rotate="varimax")$loadings # factor analysis continuous data
Loadings:
MR2 MR1
[1,] -0.602 -0.125
[2,] -0.450 0.102
[3,] 0.341 0.386
[4,] 0.443 0.251
[5,] -0.156 0.985
[6,] 0.590
次に、データを二分します。データを2つの形式で保持します。順序付けられた因子を持つデータフレームとして、および数値行列として。hetcor()
パッケージからpolycor
は、後でFAに使用するポリコリック相関行列が得られます。
# dichotomize variables into a list of ordered factors
Xdi <- lapply(Xdf, function(x) cut(x, breaks=c(-Inf, median(x), Inf), ordered=TRUE))
Xdidf <- do.call("data.frame", Xdi) # combine list into a data frame
XdiNum <- data.matrix(Xdidf) # dichotomized data as a numeric matrix
library(polycor) # for hetcor()
pc <- hetcor(Xdidf, ML=TRUE) # polychoric corr matrix -> component correlations
次に、ポリコリック相関行列を使用して、通常のFAを実行します。推定負荷は、連続データからの負荷とかなり似ていることに注意してください。
> faPC <- fa(r=pc$correlations, nfactors=2, n.obs=N, rotate="varimax")
> faPC$loadings
Loadings:
MR2 MR1
X1 -0.706 -0.150
X2 -0.278 0.167
X3 0.482 0.182
X4 0.598 0.226
X5 0.143 0.987
X6 0.571
ポリコリック相関行列を自分で計算するステップをスキップし、fa.poly()
パッケージから直接使用することができますpsych
。これは最終的に同じことを行います。この関数は、生の二分データを数値行列として受け入れます。
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
編集:因子スコアについてltm
は、factor.scores()
多倍数性の結果データ専用の機能を持つパッケージを見てください。このページの例は、「係数スコア-能力の推定値」で提供されています。
factor.plot()
およびのfa.diagram()
両方をパッケージを使用して、因子分析から負荷を視覚化できますpsych
。何らかの理由で、オブジェクト全体ではなく、からの結果factor.plot()
の$fa
コンポーネントのみを受け入れfa.poly()
ます。
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
並列分析と「非常に単純な構造」分析は、要因の数を選択するのに役立ちます。繰り返しますpsych
が、パッケージには必要な機能があります。vss()
引数として多項相関行列を取ります。
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
パッケージによって、ポリコリックFAの並列分析も提供されますrandom.polychor.pa
。
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
機能することを注意fa()
しては、fa.poly()
FAを設定するために多くのより多くの選択肢を提供します。さらに、適合度テストなどを提供する出力の一部を編集しました。これらの関数(およびパッケージpsych
全般)のドキュメントは優れています。ここでのこの例は、開始するためのものです。