Je suppose que la question est centrée moins sur le côté théorique et plus sur le côté pratique, c'est-à-dire comment mettre en œuvre une analyse factorielle des données dichotomiques dans R.
Tout d'abord, simulons 200 observations à partir de 6 variables, provenant de 2 facteurs orthogonaux. Je vais prendre quelques étapes intermédiaires et commencer avec des données continues normales multivariées que je dichotomiserai plus tard. De cette façon, nous pouvons comparer les corrélations de Pearson avec les corrélations polychoriques et comparer les charges factorielles des données continues avec celles des données dichotomiques et les charges réelles.
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)
x = Λ f+ eXΛ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
Faites l'analyse factorielle des données continues. Les charges estimées sont similaires aux vraies en ignorant le signe non pertinent.
> 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
Maintenant, dichotomisons les données. Nous conserverons les données sous deux formats: sous forme de bloc de données avec des facteurs ordonnés et sous forme de matrice numérique. hetcor()
du package polycor
nous donne la matrice de corrélation polychorique que nous utiliserons plus tard pour la 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
Utilisez maintenant la matrice de corrélation polychorique pour effectuer une FA régulière. Notez que les charges estimées sont assez similaires à celles des données continues.
> 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
Vous pouvez ignorer l'étape de calcul de la matrice de corrélation polychorique vous-même et utiliser directement à fa.poly()
partir du package psych
, qui fait la même chose au final. Cette fonction accepte les données dichotomiques brutes comme une matrice numérique.
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
EDIT: Pour les scores factoriels, regardez le package ltm
qui a une factor.scores()
fonction spécifique pour les données de résultats polytomiques. Un exemple est fourni sur cette page -> "Scores des facteurs - Estimations des capacités".
Vous pouvez visualiser les chargements à partir de l'analyse factorielle en utilisant factor.plot()
et fa.diagram()
, à la fois à partir du package psych
. Pour une raison quelconque, factor.plot()
accepte uniquement le $fa
composant du résultat de fa.poly()
, pas l'objet complet.
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
Une analyse parallèle et une analyse de "structure très simple" aident à sélectionner le nombre de facteurs. Encore une fois, le package psych
a les fonctions requises. vss()
prend comme argument la matrice de corrélation polychorique.
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
L'analyse parallèle pour FA polychorique est également fournie par le package random.polychor.pa
.
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
Notez que les fonctions fa()
et fa.poly()
fournissent beaucoup plus d'options pour configurer le FA. De plus, j'ai édité une partie de la sortie qui donne la qualité des tests d'ajustement, etc. La documentation de ces fonctions (et du package psych
en général) est excellente. Cet exemple vise uniquement à vous aider à démarrer.