Alla ricerca di un passaggio attraverso un esempio di analisi fattoriale su dati dicotomici (variabili binarie) usando R


14

Ho alcuni dati dicotomici, solo variabili binarie, e il mio capo mi ha chiesto di eseguire un'analisi fattoriale usando la matrice delle correlazioni tetrachoriche. In precedenza sono stato in grado di insegnare a me stesso come eseguire diverse analisi basate sugli esempi qui e sul sito stat dell'UCLA e altri siti simili, ma non riesco a trovare un passo attraverso un esempio di un'analisi fattoriale su dicotomia dati (variabili binarie) usando R.

Ho visto la risposta di Chl a una domanda in qualche modo simile e ho anche visto la risposta di ttnphns , ma sto cercando qualcosa di ancora più esplicito , un passo attraverso un esempio con cui posso lavorare.

Qualcuno qui conosce un tale passaggio attraverso un esempio di analisi fattoriale su variabili binarie usando R?

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

Dovrei anche aggiungere che sto lavorando con uno strumento consolidato, che ha tre dimensioni, a cui abbiamo aggiunto alcune domande aggiuntive e ora speriamo di trovare quattro dimensioni distinte. Inoltre, la nostra dimensione del campione è solo e attualmente abbiamo 19 articoli. Ho confrontato la nostra dimensione del campione e il nostro numero di articoli con un numero di articoli di psicologia e siamo decisamente nella parte bassa, ma volevamo provarlo comunque. Tuttavia, questo non è importante per l' esempio che sto cercando e l' esempio di Caracal qui sotto sembra davvero sorprendente. Ci lavorerò sopra usando i miei dati per prima cosa al mattino.n=15319


1
Dato che la FA potrebbe non essere necessariamente la scelta migliore, a seconda della domanda che ti interessa, potresti dire di più sul contesto del tuo studio?
chl

@chl, grazie per aver risposto alla mia domanda, stiamo studiando la struttura dei fattori alla base di alcune domande relative al PTSD. Siamo interessati a 1) identificare alcuni domini (cluster) e 2) indagare quanto le diverse domande caricano su ciascun dominio .
Eric Fail,

1
Per essere sicuri, (a) qual è la dimensione del tuo campione, (b) è uno strumento esistente (già validato) o un questionario fatto da te?
chl

@chl, apprezzo molto le tue domande. (a) La nostra dimensione del campione è e attualmente abbiamo 19 articoli. Ho confrontato le dimensioni del nostro campione e il nostro numero di articoli con quello che ho trovato nel Journal of Traumatic Stress e siamo decisamente nella fascia bassa, ma volevamo provarlo comunque. (b) Stiamo usando uno strumento esistente, ma con alcune domande fatte da noi aggiunte poiché riteniamo che manchino . n=153
Eric Fail,

1
Ok, grazie per questo. Dovrebbe essere facile creare un esempio funzionante con illustrazione in R.
chl

Risposte:


22

Prendo il focus della domanda è meno sul lato teorico e più sul lato pratico, cioè come implementare un'analisi fattoriale dei dati dicotomici in R.

Innanzitutto, simuliamo 200 osservazioni da 6 variabili, provenienti da 2 fattori ortogonali. Prenderò un paio di passaggi intermedi e inizierò con dati continui normali multivariati che in seguito dichoto. In questo modo, possiamo confrontare le correlazioni di Pearson con le correlazioni policoriche e confrontare i caricamenti dei fattori da dati continui con quello dei dati dicotomici e i caricamenti reali.

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

Esegui l'analisi dei fattori per i dati continui. I caricamenti stimati sono simili a quelli veri quando si ignora il segno irrilevante.

> 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       

Ora dicotomizziamo i dati. Conserveremo i dati in due formati: come un frame di dati con fattori ordinati e come matrice numerica. hetcor()dal pacchetto polycorci fornisce la matrice di correlazione policorica che useremo in seguito per l'AF.

# 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

Ora usa la matrice di correlazione policorica per fare una FA regolare. Si noti che i carichi stimati sono abbastanza simili a quelli dei dati continui.

> 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       

Puoi saltare tu stesso il passaggio del calcolo della matrice di correlazione policorica e utilizzare direttamente fa.poly()dal pacchetto psych, che alla fine fa la stessa cosa. Questa funzione accetta i dati dicotomici grezzi come matrice numerica.

faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax")    # polychoric FA
faPCdirect$fa$loadings        # loadings are the same as above ...

EDIT: per i punteggi dei fattori, guarda il pacchetto ltmche ha una factor.scores()funzione specifica per i risultati dei risultati politomici. Un esempio è fornito in questa pagina -> "Punteggi dei fattori - Stime delle abilità".

È possibile visualizzare i caricamenti dall'analisi dei fattori utilizzando factor.plot()e fa.diagram(), entrambi dal pacchetto psych. Per qualche motivo, factor.plot()accetta solo il $facomponente del risultato fa.poly(), non l'intero oggetto.

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

output da factor.plot () e fa.diagram ()

L'analisi parallela e un'analisi di "struttura molto semplice" forniscono un aiuto nella selezione del numero di fattori. Ancora una volta, il pacchetto psychha le funzioni richieste. vss()prende come argomento la matrice di correlazione policorica.

fa.parallel.poly(XdiNum)      # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax")   # very simple structure

Il pacchetto fornisce anche un'analisi parallela per l'AF policorica random.polychor.pa.

library(random.polychor.pa)    # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)

output da fa.parallel.poly () e random.polychor.pa ()

Si noti che le funzioni fa()e fa.poly()forniscono molte altre opzioni per impostare l'AF. Inoltre, ho modificato parte dell'output che fornisce bontà dei test di adattamento, ecc. La documentazione per queste funzioni (e il pacchetto psychin generale) è eccellente. Questo esempio qui è solo per iniziare.


Il tuo passaggio attraverso l'esempio sembra fantastico. Ci lavorerò su usando i miei dati al mattino e ti ricontatterò. Grazie per aver dedicato del tempo a scrivere questo. Se ti capita di avere dei riferimenti teorici, sarei interessato anche a loro. Chl ha raccomandato il libro di testo di Revelle per la psicometria in R e lo darò sicuramente a dare un'occhiata. Grazie
Eric Fail

@caracal: psychpermette in qualche modo di stimare i punteggi dei fattori quando vengono usate correlazioni poli / tetra-coriche al posto del solito Pearson r?
ttnphns,

3
Siamo spiacenti, @caracal, non sono un utente R. Ecco perché lo sto chiedendo. Dato che non hai usato Pearson originale ma tetrachorico, hai perso il collegamento lineare-algebrico diretto tra i dati binari originali e la matrice di caricamento. Immagino che in questo caso verrebbe usato un algo speciale (ad esempio basato sull'approccio EM) al posto della regressione classica / Bartlett. Quindi psychla causa è dovuta al fatto che avevamo a che fare con t tetrachorica, non con r abituale, quando calcola i punteggi dei fattori o no?
ttnphns,

1
@EricFail Poiché le matrici di correlazione policorica sono stimate passando attraverso le correlazioni a coppie, una matrice finale definita non positiva diventa effettivamente più comune con l'aumentare del numero di variabili e il numero di osservazioni è fisso (vedere questa discussione MPlus ). In questo caso vengono utilizzate funzioni come nearcor()da sfsmisco cor.smooth()da psych.
Caracal,

1
@ttnphns Siamo spiacenti, ho frainteso la tua domanda. Buona domanda! Originariamente ho pensato che qualcosa di simile mplus appendice tecnica 11 è stata attuata, ma guardando il codice per psychs' factor.scores(), non è questo il caso. Invece, i punteggi vengono calcolati proprio come nel caso continuo. Tuttavia, la factor.scores()funzione nel pacchetto ltmsembra implementare le procedure corrette, vedere questo esempio -> "Punteggi dei fattori - Stime delle capacità" e la pagina della guida.
Caracal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.