Recherche d'une étape dans un exemple d'analyse factorielle sur des données dichotomiques (variables binaires) à l'aide de R

14

J'ai quelques données dichotomiques, seulement des variables binaires, et mon patron m'a demandé d'effectuer une analyse factorielle en utilisant la matrice de corrélations tétrachoriques. J'ai déjà pu m'apprendre à exécuter différentes analyses sur la base des exemples ici et sur le site de statistiques de l' UCLA et d'autres sites similaires, mais je n'arrive pas à trouver une étape à travers un exemple d'analyse factorielle sur dichotomique données (variables binaires) à l'aide de R.

J'ai vu la réponse de chl à une question un peu similaire et j'ai également vu la réponse de ttnphns , mais je cherche quelque chose de plus explicite , une étape dans un exemple avec lequel je peux travailler.

Quelqu'un ici connaît-il une telle étape grâce à un exemple d'analyse factorielle sur des variables binaires utilisant R?

Mise à jour 2012-07-11 22: 03: 35Z

Je dois également ajouter que je travaille avec un instrument établi, qui a trois dimensions, auquel nous avons ajouté quelques questions supplémentaires et nous espérons maintenant trouver quatre dimensions distinctes. De plus, notre taille d'échantillon n'est que de et nous avons actuellement articles. J'ai comparé notre taille d'échantillon et notre nombre d'articles à un certain nombre d'articles de psychologie et nous sommes définitivement dans le bas de l'échelle, mais nous voulions quand même l'essayer. Cependant, ce n'est pas important pour l' exemple pas à pas que je recherche et l' exemple de caracal ci-dessous est vraiment incroyable. Je vais travailler à ma façon en utilisant mes données dès le matin.n=15319

Eric Fail
la source
1
Étant donné que l'AF n'est pas nécessairement le meilleur choix, selon la question qui vous intéresse, pourriez-vous en dire plus sur le contexte de votre étude?
chl
@chl, merci d'avoir répondu à ma question, nous étudions la structure factorielle sous-jacente de certaines questions concernant le SSPT. Nous souhaitons 1) identifier certains domaines (clusters) et 2) déterminer la charge des différentes questions sur chaque domaine .
Eric Fail
1
Juste pour être sûr, (a) quelle est la taille de votre échantillon, (b) s'agit-il d'un instrument existant (déjà validé) ou d'un questionnaire créé par vous-même?
chl
n=153
1
Ok, merci pour ça. Cela devrait être facile de mettre en place un exemple de travail avec une illustration dans R.
chl

Réponses:

22

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 polycornous 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 ltmqui 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 $facomposant du résultat de fa.poly(), pas l'objet complet.

factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)

sortie de factor.plot () et fa.diagram ()

Une analyse parallèle et une analyse de "structure très simple" aident à sélectionner le nombre de facteurs. Encore une fois, le package psycha 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)

sortie de fa.parallel.poly () et random.polychor.pa ()

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 psychen général) est excellente. Cet exemple vise uniquement à vous aider à démarrer.

caracal
la source
Votre exemple par exemple est superbe. Je travaillerai à ma façon en utilisant mes données le matin et je vous recontacterai. Merci d'avoir pris le temps d'écrire ceci. S'il vous arrive d'avoir des références théoriques, je serais également intéressé. Chl a recommandé le manuel de Revelle pour la psychométrie en R et je vais certainement y jeter un œil. Merci
Eric Fail
@caracal: psychpermet en quelque sorte d'estimer les scores des facteurs lorsque des corrélations poly / tétra-choriques sont utilisées à la place du r Pearson habituel?
ttnphns
3
Désolé, @caracal, je ne suis pas utilisateur R. Voilà pourquoi je le demande. Puisque vous n'avez pas utilisé Pearson r d'origine mais r tétrachorique, vous avez perdu le lien linéaire-algébrique simple entre les données binaires originales et la matrice de chargement. J'imagine que dans ce cas, un algo spécial serait utilisé (par exemple basé sur l'approche EM) à la place de la régression classique / Bartlett one. Alors, est- psychce dû au fait que nous avions affaire à r tétrachorique, pas à r habituel, lorsqu'il calcule les scores factoriels, ou non?
ttnphns
1
@EricFail Comme les matrices de corrélation polychoriques sont estimées en passant par les corrélations par paires, une matrice d'extrémité définie non positive devient en effet plus courante à mesure que le nombre de variables augmente et que le nombre d'observations est fixe (voir cette discussion MPlus ). Des fonctions telles que nearcor()from sfsmiscou cor.smooth()from psychsont utilisées dans ce cas.
caracal
1
@ttnphns Désolé, j'ai mal compris votre question. Bonne question! Au départ , je pensais que quelque chose comme MPlus annexe technique 11 a été mis en œuvre, mais en regardant le code pour psych« s factor.scores(), ce n'est pas le cas. Au lieu de cela, les scores sont calculés comme dans le cas continu. Cependant, la factor.scores()fonction dans le package ltmsemble implémenter les procédures correctes, voir cet exemple -> "Factor Scores - Ability Estimates" et la page d'aide.
caracal