Ich gehe davon aus, dass der Fokus der Frage weniger auf der theoretischen als vielmehr auf der praktischen Seite liegt, dh wie eine Faktorenanalyse dichotomer Daten in R implementiert werden kann.
Simulieren wir zunächst 200 Beobachtungen aus 6 Variablen, die aus 2 orthogonalen Faktoren stammen. Ich werde ein paar Zwischenschritte machen und mit multivariaten normalen kontinuierlichen Daten beginnen, die ich später dichotomisiere. Auf diese Weise können wir Pearson-Korrelationen mit polychromen Korrelationen vergleichen und Faktorladungen aus kontinuierlichen Daten mit denen aus dichotomen Daten und den wahren Ladungen vergleichen.
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)
Simulieren Sie nun die tatsächlichen Daten aus dem Modell , wobei x die beobachteten Variablenwerte einer Person sind ,, die wahre Belastungsmatrix,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
Führen Sie die Faktoranalyse für die kontinuierlichen Daten durch. Die geschätzten Belastungen sind ähnlich wie die wahren, wenn das irrelevante Vorzeichen ignoriert wird.
> 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
Nun wollen wir die Daten dichotomisieren. Wir werden die Daten in zwei Formaten speichern: als Datenrahmen mit geordneten Faktoren und als numerische Matrix. hetcor()
from package polycor
gibt uns die polychrone Korrelationsmatrix, die wir später für die FA verwenden werden.
# 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
Verwenden Sie nun die polychrone Korrelationsmatrix, um eine reguläre FA durchzuführen. Beachten Sie, dass die geschätzten Ladungen denen aus den kontinuierlichen Daten ziemlich ähnlich sind.
> 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
Sie können den Schritt der Berechnung der polychromen Korrelationsmatrix selbst überspringen und direkt fa.poly()
aus dem Paket verwenden psych
, was letztendlich dasselbe bewirkt. Diese Funktion akzeptiert die dichotomen Rohdaten als numerische Matrix.
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
BEARBEITEN: Für Faktorwerte schauen Sie sich das Paket an, ltm
das eine factor.scores()
Funktion speziell für polytome Ergebnisdaten hat. Ein Beispiel finden Sie auf dieser Seite -> "Faktor-Scores - Fähigkeitsschätzungen".
Sie können die Belastungen aus der Faktoranalyse mit factor.plot()
und fa.diagram()
aus dem Paket visualisieren psych
. Aus irgendeinem Grund factor.plot()
akzeptiert nur die $fa
Komponente des Ergebnisses ausfa.poly()
, nicht das vollständige Objekt.
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
Die parallele Analyse und eine "sehr einfache Struktur" -Analyse helfen bei der Auswahl der Anzahl der Faktoren. Wieder paketierenpsych
die erforderlichen Funktionen. vss()
Nimmt die polychrone Korrelationsmatrix als Argument.
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
Parallele Analyse für polychrone FA ist ebenfalls im Paket enthalten random.polychor.pa
.
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
Beachten Sie, dass die Funktionen fa()
und fa.poly()
viele weitere Optionen zum Einrichten des FA bieten. Außerdem habe ich einen Teil der Ausgabe herausgeschnitten, der Passungstests usw. enthält. Die Dokumentation für diese Funktionen (und das Paket psych
im Allgemeinen) ist ausgezeichnet. Dieses Beispiel soll Ihnen nur den Einstieg erleichtern.