2010-11-10 13 views
11

Quando si esegue un'analisi fattoriale mediante factanal, il risultato normale è una tabella con alcuni caricamenti più numerose altre informazioni. Esiste un modo diretto per utilizzare questi loadings per creare una matrice/data.frame di fattori? Ad esempio per utilizzarli in analisi di regressione in seguito.Come creare fattori da factanal?

MODIFICA: lo scopo di questo è ottenere le variabili per la modellazione successiva. So solo che i punteggi dei fattori sono benvenuti :)

EDIT2: Joris Meys risposta di risposta è fondamentalmente ciò che stavo chiedendo. Nonostante ciò sposta la mia domanda verso una direzione che potrebbe essere più adatta per statsoverflow, ma la terrò qui per ora, perché il giusto gruppo di persone è la discussione della soluzione:

Qual è il vantaggio della regressione punteggi basati? Il risultato del prodotto (ML) è altamente correlato con i fattori ... Onestamente mi chiedo perché la differenza è così grande nel mio caso?

fa$scores # the correct solution 
fac <- m1 %*% loadings(fa) # the answer on your question 
diag(cor(fac,fa$scores)) 
#returns: 
Factor1 Factor2 Factor3 
0.8309343 0.8272019 0.8070837 

risposta

21

Hai chiesto come utilizzare i caricamenti per la costruzione dei punteggi. La tua soluzione è, anche se corretta, non farlo. Sta usando un metodo di regressione (in alternativa puoi usare anche il metodo di Bartlett), e usa la restrizione che i punteggi non sono correlati, centrati attorno a 0 e con varianza = 1. Questi non sono quindi gli stessi fattori che si otterrebbero usando F = ML con F la matrice fattoriale, M la matrice originale e L la matrice di caricamento.

una dimostrazione con l'esempio i file di aiuto:

v1 <- c(1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,4,5,6) 
v2 <- c(1,2,1,1,1,1,2,1,2,1,3,4,3,3,3,4,6,5) 
v3 <- c(3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,5,4,6) 
v4 <- c(3,3,4,3,3,1,1,2,1,1,1,1,2,1,1,5,6,4) 
v5 <- c(1,1,1,1,1,3,3,3,3,3,1,1,1,1,1,6,4,5) 
v6 <- c(1,1,1,2,1,3,3,3,4,3,1,1,1,2,1,6,5,4) 
m1 <- cbind(v1,v2,v3,v4,v5,v6) 

fa <- factanal(m1, factors=3,scores="regression") 

fa$scores # the correct solution 

fac <- m1 %*% loadings(fa) # the answer on your question 

Questi sono valori chiaramente differenti.

Modifica: questo ha a che fare con il fatto che i punteggi di regressione di Thomson si basano su variabili ridimensionate e tengono conto della matrice di correlazione. Se volete calcolare i punteggi a mano, faresti:

> fac2 <- scale(m1) %*% solve(cor(m1)) %*% loadings(fa) 
> all.equal(fa$scores,as.matrix(fac2)) 
[1] TRUE 

Per ulteriori informazioni, vedere this review

e mostrarvi perché è importante: se si calcolano i punteggi il modo "ingenuo" , i tuoi punteggi sono effettivamente correlati. E questo è ciò di cui volevi liberarti in primo luogo:

> round(cor(fac),2) 
     Factor1 Factor2 Factor3 
Factor1 1.00 0.79 0.81 
Factor2 0.79 1.00 0.82 
Factor3 0.81 0.82 1.00 

> round(cor(fac2),2) 
     Factor1 Factor2 Factor3 
Factor1  1  0  0 
Factor2  0  1  0 
Factor3  0  0  1 
+0

Sì, questo è quello che ho chiesto. La standardizzazione è l'unico vantaggio di questi punteggi creati dalla regressione? Il calcolo della matrice ML fornisce variabili altamente correlate (vedi modifica della mia domanda). –

+3

@ ran2: No, questi punteggi hanno un po 'più di matematica dietro di loro, che è scarsamente spiegato nel file di aiuto di factanal. Una panoramica più elaborata può essere trovata in questo documento: http://www.psy.ed.ac.uk/people/iand/Bartholomew%20%282009%29%20Br%20J%20Math%20Stat%20Psychol%20factor%20scores % 20Thomson% 20Spearman% 20Bartlett.pdf –

+2

acc. Grazie per la lezione, amico! –

3

Non ho controllato manualmente, ma here's un modo farlo:

fa <- factanal(mydf,3,rotation="varimax",scores="regression") 
fa$scores 

HTH qualcun altro. Suggerimenti, correzioni, miglioramenti benvenuti!

+5

utilizzando una rotazione di promax viola l'assunzione di punteggi non correlati. Sebbene l'interpretazione _chieda_ più facile, la struttura dei dati è stata profondamente cambiata. Bisogna essere molto, molto prudenti usando una rotazione non ortogonale. –

+0

Thx! input molto prezioso. L'ho solo mescolato, stavo solo provando, l'interpretazione non migliora con essa.Ho appena controllato la robustezza della mia interpretazione e ho postato la riga sbagliata. –

2

Non si desidera il componente loadings?

loadings(fa) 

Vedi ?loadings e ?factanal per verificare che si tratta di carichi che si desidera. Trovo la terminologia usata a volte confusa, cosa con caricamenti, punteggi, ...

+0

in effetti è confuso. ma ciò che suggerisci è equivalente a $ loadings che amano la "correlazione" con un fattore. Quello che voglio è un fattore su base per osservazione. –

+0

Stavo dicendo che 'mydf% *% loadings (fa)' è quello che pensavo volessi ... E vedo che Joris ha suggerito una cosa del genere nella sua risposta. –

+0

Scusa Gavin - a volte ho solo bisogno di un piccolo aiuto in più. Ho visto cosa intendevi a prima vista. Grazie a Joris e il tuo commento è chiaro ed è la risposta alla mia domanda :) –

Problemi correlati