Auf der Suche nach einem Schritt durch ein Beispiel einer Faktoranalyse für dichotome Daten (binäre Variablen) mit R


14

Ich habe dichotome Daten, nur binäre Variablen, und mein Chef hat mich gebeten, eine Faktorenanalyse unter Verwendung der tetrachorischen Korrelationsmatrix durchzuführen. Ich habe mir zuvor selbst beigebracht, wie man verschiedene Analysen basierend auf den Beispielen hier und auf der Statistik-Site der UCLA und ähnlichen Sites durchführt, aber ich kann anscheinend keinen Schritt durch ein Beispiel einer Faktoranalyse zu dichotom finden Daten (binäre Variablen) mit R.

Ich habe chl Antwort auf eine etwas simular Frage und ich sah auch Antwort ttnphns , aber ich bin auf der Suche nach etwas noch buchstabiert , einen Schritt durch ein Beispiel , das ich arbeiten kann.

Kennt jemand hier einen solchen Schritt durch ein Beispiel einer Faktoranalyse für binäre Variablen mit R?

Update 2012-07-11 22: 03: 35Z

Ich möchte auch hinzufügen, dass ich mit einem etablierten Instrument arbeite, das drei Dimensionen hat, zu dem wir einige zusätzliche Fragen hinzugefügt haben, und wir hoffen nun, vier verschiedene Dimensionen zu finden. Darüber hinaus beträgt unser Stichprobenumfang nur , und wir haben derzeit 19 Artikel. Ich habe unsere Stichprobengröße und die Anzahl unserer Artikel mit einer Reihe von Artikeln aus der Psychologie verglichen und wir befinden uns definitiv im unteren Bereich, aber wir wollten es trotzdem versuchen. Dies ist jedoch für das von mir gesuchte Step-through-Beispiel nicht wichtig, und das folgende Beispiel für Caracal sieht wirklich fantastisch aus. Ich werde mich morgens als erstes mit meinen Daten durcharbeiten.n=15319


1
Da FA abhängig von der Frage, die Sie interessiert, nicht unbedingt die beste Wahl ist, können Sie mehr zum Kontext Ihrer Studie sagen?
Chl

@chl, wir danken Ihnen für meine Frage beantwortet, wir untersuchen die zugrundeliegenden Faktor Struktur einiger Fragen zu PTSD. Wir sind daran interessiert, 1) einige Domänen (Cluster ) zu identifizieren und 2) zu untersuchen, wie viel die verschiedenen Fragen auf jede Domäne geladen sind .
Eric Fail

1
Nur um sicherzugehen, (a) wie groß ist Ihre Stichprobe, (b) handelt es sich um ein vorhandenes (bereits validiertes) Instrument oder einen selbst erstellten Fragebogen?
chl

@chl, ich freue mich sehr über deine Fragen. (a) Unsere Stichprobengröße ist , und wir haben derzeit 19 Artikel. Ich habe unsere Stichprobengröße und die Anzahl der Artikel mit dem verglichen, was ich im Journal of Traumatic Stress finden konnte, und wir befinden uns definitiv im unteren Bereich, aber wir wollten es trotzdem versuchen. (b) Wir verwenden ein vorhandenes Instrument, aber es wurden einige selbst gestellte Fragen hinzugefügt, da wir glauben, dasssie fehlen. n=153
Eric Fail

1
Ok, danke dafür. Das sollte einfach sein, ein funktionierendes Beispiel mit Illustration in R.
chl 11.07.12

Antworten:


22

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 polycorgibt 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, ltmdas 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 $faKomponente des Ergebnisses ausfa.poly() , nicht das vollständige Objekt.

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

Ausgabe von factor.plot () und fa.diagram ()

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)

Ausgabe von fa.parallel.poly () und random.polychor.pa ()

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 psychim Allgemeinen) ist ausgezeichnet. Dieses Beispiel soll Ihnen nur den Einstieg erleichtern.


Ihr Schritt durch Beispiel sieht gut aus. Ich arbeite mich morgens mit meinen Daten durch und melde mich dann bei Ihnen. Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu schreiben. Wenn Sie theoretische Referenzen haben, würde mich das auch interessieren. Chl hat Revelles Lehrbuch für Psychometrie in R empfohlen, und ich werde mir das auf jeden Fall ansehen. Vielen Dank
Eric Fail

@caracal: Ermöglicht psyches irgendwie, Faktor-Scores zu schätzen , wenn poly / tetra-chorische Korrelationen anstelle der üblichen Pearson- Werte verwendet werden?
ttnphns

3
Sorry, @caracal, ich bin kein R-User. Deshalb frage ich es. Da Sie nicht Original Pearson r, sondern Tetrachoric r verwendet haben, haben Sie die direkte linear-algebraische Verbindung zwischen Original-Binärdaten und der Ladematrix verloren. Ich stelle mir vor, dass in diesem Fall anstelle der klassischen Regression / Bartlett-Methode ein spezielles Algo verwendet wird (z. B. basierend auf dem EM-Ansatz). Gibt es also psycheinen Grund dafür, dass wir uns mit tetrachorischem r befasst haben, nicht mit gewöhnlichem r, wenn es Faktor-Scores berechnet, oder nicht?
TTNPHNS

1
@EricFail Da polychrone Korrelationsmatrizen geschätzt werden, indem die paarweisen Korrelationen durchlaufen werden, wird eine nicht positive definite Endmatrix tatsächlich häufiger, wenn die Anzahl der Variablen zunimmt und die Anzahl der Beobachtungen festgelegt ist (siehe diese MPlus-Diskussion ). In diesem Fall werden Funktionen wie nearcor()from sfsmiscoder cor.smooth()from psychverwendet.
Karakal

1
@ttnphns Sorry, ich habe deine Frage falsch verstanden. Gute Frage! Ich war ursprünglich davon ausgegangen, dass so etwas wie MPlus, technischer Anhang 11, implementiert wurde, aber wenn man den Code für psych's betrachtet factor.scores(), ist dies nicht der Fall. Stattdessen werden die Ergebnisse genau wie im kontinuierlichen Fall berechnet. Die factor.scores()im Paket enthaltene Funktion ltmscheint jedoch die richtigen Verfahren zu implementieren. Siehe hierzu das Beispiel -> "Faktor-Scores - Fähigkeitsschätzungen" und die Hilfeseite.
Karakal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.