::here("code", "_common.R") |>
heresource()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
::p_load(lavaan, psych) pacman
37 La rotazione fattoriale
Prerequisiti
Concetti e Competenze Chiave
Preparazione del Notebook
Nel Capitolo 36 abbiamo determinato il numero ottimale di fattori comuni. Tuttavia, la soluzione iniziale, non ruotata, può risultare difficile da interpretare. Per ottenere una struttura fattoriale più semplice e intuitiva, si procede alla rotazione degli assi fattoriali. L’obiettivo della rotazione è quello di identificare gruppi omogenei di variabili che saturano fortemente su un singolo fattore e con saturazioni trascurabili sugli altri.
37.1 Indeterminatezza della soluzione fattoriale
La necessità di effettuare la rotazione deriva dal fatto che la matrice delle saturazioni non ha un’unica soluzione. Attraverso trasformazioni matematiche, è possibile ottenere infinite matrici dello stesso ordine. Questo fenomeno è noto come indeterminatezza della soluzione fattoriale.
La matrice delle saturazioni fattoriali \(\boldsymbol{\Lambda}\) non è univocamente definita poiché non esiste una soluzione unica per determinare le saturazioni fattoriali. Una matrice di correlazioni \(\boldsymbol{R}\) può produrre diverse soluzioni fattoriali, ovvero matrici con lo stesso numero di fattori comuni ma con diverse configurazioni di saturazioni fattoriali, o matrici di saturazioni fattoriali corrispondenti a un diverso numero di fattori comuni.
Esempio. Siano \(\boldsymbol{\Lambda}_1\) e \(\boldsymbol{\Lambda}_2\) due matrici aventi lo stesso numero di righe e colonne, ma contenenti saturazioni fattoriali diverse. \(\boldsymbol{\Lambda}_1\) è definita dai valori seguenti
<- matrix(
l1 c(
0.766, -0.232,
0.670, -0.203,
0.574, -0.174,
0.454, 0.533,
0.389, 0.457,
0.324, 0.381
),byrow = TRUE, ncol = 2
)
mentre per \(\boldsymbol{\Lambda}_2\) abbiamo
<- matrix(
l2 c(
0.783, 0.163,
0.685, 0.143,
0.587, 0.123,
0.143, 0.685,
0.123, 0.587,
0.102, 0.489
),byrow = TRUE, ncol = 2
)
Esaminiamo la matrice delle correlazioni riprodotte dalle due matrici di pesi fattoriali (con le comunalità sulla diagonale di \(\boldsymbol{R}\)):
%*% t(l1) |> round(2) l1
0.64 | 0.56 | 0.48 | 0.22 | 0.19 | 0.16 |
0.56 | 0.49 | 0.42 | 0.20 | 0.17 | 0.14 |
0.48 | 0.42 | 0.36 | 0.17 | 0.14 | 0.12 |
0.22 | 0.20 | 0.17 | 0.49 | 0.42 | 0.35 |
0.19 | 0.17 | 0.14 | 0.42 | 0.36 | 0.30 |
0.16 | 0.14 | 0.12 | 0.35 | 0.30 | 0.25 |
%*% t(l2) |> round(2) l2
0.64 | 0.56 | 0.48 | 0.22 | 0.19 | 0.16 |
0.56 | 0.49 | 0.42 | 0.20 | 0.17 | 0.14 |
0.48 | 0.42 | 0.36 | 0.17 | 0.14 | 0.12 |
0.22 | 0.20 | 0.17 | 0.49 | 0.42 | 0.35 |
0.19 | 0.17 | 0.14 | 0.42 | 0.36 | 0.30 |
0.16 | 0.14 | 0.12 | 0.35 | 0.30 | 0.25 |
Come si vede, viene ottenuto lo stesso risultato utilizzando matrici \(\boldsymbol{\Lambda}\) con lo stesso numero \(m\) di colonne ma saturazioni fattoriali diverse.
Si consideri ora il caso di matrici \(\boldsymbol{\Lambda}\) corrispondenti a soluzioni fattoriali con un diverso numero di fattori comuni. Siano \(\boldsymbol{\Lambda}_1\) e \(\boldsymbol{\Lambda}_2\) due matrici aventi lo stesso numero di righe ma un numero diverso di colonne:
<- matrix(
l1 c(
0.9,
0.7,
0.5,
0.3
),byrow = TRUE, ncol = 1
)
<- matrix(
l2 c(
0.78, 0.45,
0.61, 0.35,
0.43, 0.25,
0.25, 0.15
),byrow = TRUE, ncol = 2
)
Si noti che la stessa matrice di correlazioni riprodotte (con le comunalità sulla diagonale principale) viene generata dalle saturazioni fattoriali corrispondenti ad un numero diverso di fattori comuni:
%*% t(l1) |> round(2) l1
0.81 | 0.63 | 0.45 | 0.27 |
0.63 | 0.49 | 0.35 | 0.21 |
0.45 | 0.35 | 0.25 | 0.15 |
0.27 | 0.21 | 0.15 | 0.09 |
%*% t(l2) |> round(2) l2
0.81 | 0.63 | 0.45 | 0.26 |
0.63 | 0.49 | 0.35 | 0.20 |
0.45 | 0.35 | 0.25 | 0.14 |
0.26 | 0.20 | 0.14 | 0.08 |
37.2 Parsimonia e semplicità
Per ottenere risultati affidabili dall’analisi fattoriale, si affronta il problema dell’indeterminazione fattoriale scegliendo la soluzione che soddisfa due criteri fondamentali: il criterio della parsimonia e il criterio della semplicità.
Il criterio della parsimonia richiede di scegliere il modello con il minor numero di fattori comuni che può spiegare la covarianza tra le variabili. In pratica, se ci sono due soluzioni fattoriali con un diverso numero di fattori che riproducono allo stesso modo la matrice di covarianza o di correlazione, si sceglie quella con il minor numero di fattori.
In caso invece ci siano diverse soluzioni fattoriali con lo stesso numero m di fattori, il criterio della semplicità guida nella scelta della trasformazione più appropriata della matrice di saturazioni fattoriali \(\boldsymbol{\Lambda}\). Questa trasformazione, nota come rotazione, cerca di rendere i fattori più interpretabili. Ci sono due tipi di rotazione: ortogonale e obliqua.
La rotazione ortogonale assume che i fattori siano incorrelati, mentre la rotazione obliqua consente correlazioni tra i fattori. L’obiettivo della rotazione è di trovare una soluzione che renda i fattori più facilmente interpretabili e, quindi, in grado di spiegare meglio i dati.
37.2.1 Il Criterio della Struttura Semplice nell’Analisi Fattoriale
L’analisi fattoriale impiega la rotazione degli assi fattoriali per ottenere una “struttura semplice” nella matrice delle saturazioni fattoriali. Questo criterio, proposto originariamente da Thurstone nel 1947, mira a realizzare una matrice caratterizzata da un numero limitato di saturazioni (o carichi fattoriali) significative e diverse da zero, minimizzando al contempo la presenza di variabili influenzate da più di un fattore.
Per raggiungere una struttura semplice, Thurstone ha delineato specifiche condizioni che la matrice fattoriale ruotata deve soddisfare:
- Ogni variabile deve presentare saturazioni nulle con la maggior parte dei fattori, escludendo uno o pochi con cui mostra saturazioni significative.
- Per ciascun fattore, devono esistere almeno \(m\) saturazioni nulle, dove \(m\) è il numero totale di fattori comuni.
L’obiettivo della rotazione è quindi massimizzare il numero di saturazioni nulle o quasi nulle, facilitando l’interpretazione dei fattori. Analizzando la matrice ruotata, è possibile identificare le variabili che sono fortemente associate a specifici fattori e valutare l’intensità di tali associazioni.
Un fattore si interpreta efficacemente quando i suoi carichi sono elevati e positivi su un gruppo ristretto di variabili; ciò suggerisce che il fattore rappresenta un tratto o una caratteristica comune a tali variabili. Tuttavia, l’interpretazione diventa più complessa quando le variabili presentano saturazioni significative con più di un fattore, poiché indica la presenza di sovrapposizioni nelle influenze fattoriali.
37.3 Rotazione nello Spazio Geometrico
37.3.1 Rotazione Ortogonale
Come precedentemente osservato, la matrice delle saturazioni fattoriali non è unica, implicando l’esistenza di multiple soluzioni equivalenti per determinare i pesi fattoriali. La rotazione ortogonale è un tipo di trasformazione lineare applicata ai pesi fattoriali per produrre una nuova matrice di saturazioni fattoriali che rispetti criteri specifici di struttura semplice. Questo processo ha lo scopo di rendere i dati più facilmente interpretabili.
Geometricamente parlando, la rotazione ortogonale è simile a una rotazione rigida degli assi in uno spazio cartesiano che rappresenta i pesi fattoriali. Tale rotazione conserva le distanze tra i punti (che rappresentano le saturazioni fattoriali) ma modifica la loro posizione relativa rispetto ai fattori. Di conseguenza, si ottiene una configurazione dei pesi fattoriali che è più semplice da interpretare.
Le tecniche di rotazione ortogonale sono tipicamente implementate attraverso metodi come la massima verosimiglianza o l’analisi dei componenti principali, con l’obiettivo di massimizzare il numero di saturazioni nulle o quasi nulle nella matrice delle saturazioni risultante. Questo processo aiuta a chiarire quale variabile è influenzata maggiormente da quali fattori, facilitando l’interpretazione dei risultati dell’analisi fattoriale.
37.3.2 Vincoli alla Rotazione dei Fattori
Il problema della non identificabilità della matrice dei pesi fattoriali, denotata come \(\hat{\boldsymbol{\Lambda}}\), indica l’esistenza di molteplici matrici equivalenti che possono produrre identiche correlazioni tra le variabili di un modello. Per affrontare questa questione, è essenziale imporre vincoli sulla rotazione dei fattori. Uno dei criteri fondamentali nella scelta del tipo di rotazione è l’ottenimento di una matrice \(\hat{\boldsymbol{\Lambda}}\) semplificata, i cui elementi si avvicinano il più possibile ai valori 0 e 1. Questo facilita l’interpretazione dei fattori come combinazioni lineari delle variabili.
Le rotazioni ortogonali, utili in presenza di fattori non correlati, mantengono inalterate le comunalità, poiché conservano le distanze geometriche tra i punti rappresentati dai pesi fattoriali. In questo caso, le comunalità sono calcolate come la somma dei quadrati dei pesi fattoriali. Al contrario, le rotazioni non ortogonali modificano la quota di varianza spiegata da ciascun fattore, calcolata dalla somma dei quadrati dei pesi fattoriali divisa per la traccia della matrice di correlazione.
Esistono vari algoritmi per eseguire la rotazione ortogonale dei fattori, tra cui il metodo grafico, il metodo Quartimax e il metodo Varimax. Ciascuno di questi metodi ha specifiche applicazioni e impatti sulla struttura della matrice risultante, facilitando così l’interpretazione dei dati analizzati.
37.3.3 Metodo Grafico per la Rotazione dei Fattori
Quando si dispone di soli $ m=2 $ fattori, il sistema di coordinate bidimensionale è utilizzato per rappresentare geometricamente i fattori. La visualizzazione grafica delle saturazioni fattoriali permette di determinare visivamente la rotazione più appropriata. Ogni riga della matrice \(\hat{\boldsymbol{\Lambda}}\) rappresenta un paio di pesi fattoriali, \(\hat{\lambda}_{i1}, \hat{\lambda}_{i2}\), con \(i=1, \dots, p\), che corrispondono alle coordinate di \(p\) punti (equivalenti al numero di variabili manifeste). Per ottimizzare la rappresentazione, gli assi vengono ruotati di un angolo \(\phi\) per avvicinarli il più possibile alla disposizione dei punti sul grafico. Le nuove coordinate \((\hat{\lambda}_{i1}^*, \hat{\lambda}_{i2}^*)\) sono calcolate mediante la trasformazione \(\hat{\boldsymbol{\Lambda}}^* = \hat{\boldsymbol{\Lambda}} \textbf{T}\), dove
\[ \textbf{T} = \begin{bmatrix} \cos{\phi} & -\sin{\phi}\\ \sin{\phi} & \cos{\phi} \end{bmatrix} \]
è una matrice ortogonale \(2 \times 2\).
Esempio: Consideriamo un caso studiato da Brown, Williams e Barlow (1984), analizzato in Rencher (2002). Ad una ragazza di dodici anni è stato chiesto di valutare sette suoi conoscenti su cinque attributi: gentilezza, intelligenza, felicità, simpatia e giustizia. Per queste variabili, la matrice di correlazione \(R\) è stata analizzata per estrarre due fattori mediante il metodo delle componenti principali, senza rotazione iniziale:
<- matrix(
R c(
1.00, .296, .881, .995, .545,
296, 1.000, -.022, .326, .837,
.881, -.022, 1.000, .867, .130,
.995, .326, .867, 1.000, .544,
.545, .837, .130, .544, 1.00
.
),ncol = 5, byrow = TRUE, dimnames = list(
c("K", "I", "H", "L", "J"), c("K", "I", "H", "L", "J")
)
)
print(R)
K I H L J
K 1.000 0.296 0.881 0.995 0.545
I 0.296 1.000 -0.022 0.326 0.837
H 0.881 -0.022 1.000 0.867 0.130
L 0.995 0.326 0.867 1.000 0.544
J 0.545 0.837 0.130 0.544 1.000
Dalla matrice \(R\), estraiamo due fattori. Si osserva che i fattori risultano difficili da interpretare: il primo fattore mostra alte saturazioni positive su tutte le variabili manifeste, mentre il secondo fattore si caratterizza per alte saturazioni positive su una variabile e negative sulle altre.
<- principal(R, 2, rotate = FALSE)
f.pc f.pc
Principal Components Analysis
Call: principal(r = R, nfactors = 2, rotate = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
PC1 PC2 h2 u2 com
K 0.97 -0.23 0.99 0.0067 1.1
I 0.52 0.81 0.92 0.0792 1.7
H 0.78 -0.59 0.96 0.0391 1.9
L 0.97 -0.21 0.99 0.0135 1.1
J 0.70 0.67 0.94 0.0597 2.0
PC1 PC2
SS loadings 3.26 1.54
Proportion Var 0.65 0.31
Cumulative Var 0.65 0.96
Proportion Explained 0.68 0.32
Cumulative Proportion 0.68 1.00
Mean item complexity = 1.6
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is 0.03
Fit based upon off diagonal values = 1
In un grafico delle saturazioni fattoriali, i punti rappresentano le cinque coppie di saturazioni (una per ciascun fattore):
plot(
$load[, 1], f.pc$load[, 2],
f.pcbty = "n", xaxt = "n",
xlab = "Primo Fattore", ylab = "Secondo Fattore",
ylim = c(-.6, 1), xlim = c(0, 1), pch = 19, asp = 1
)axis(1, pos = c(0, 0))
abline(0, 0)
Rencher (2002) suggerisce che una rotazione ortogonale di \(-35^\circ\) avvicinerebbe efficacemente gli assi ai punti nel diagramma di dispersione. Per verificarlo, si può disegnare i nuovi assi nel grafico dopo una rotazione di \(-35^\circ\).
plot(
$load[, 1], f.pc$load[, 2],
f.pcbty = "n", xaxt = "n",
xlab = "Primo Fattore", ylab = "Secondo Fattore",
ylim = c(-.6, 1), xlim = c(0, 1), pch = 19, asp = 1
)axis(1, pos = c(0, 0))
abline(0, 0)
<- matrix(c(
ar 0, 0,
0, 1,
0, 0,
1, 0
ncol = 2, byrow = TRUE)
),
<- 35
angle <- angle * pi / 180
rad <- matrix(c(
T cos(rad), -sin(rad),
sin(rad), cos(rad)
ncol = 2, byrow = TRUE)
),
round(ar %*% T, 3)
arrows(0, 0, 0.574, 0.819, lwd = 2)
arrows(0, 0, 0.819, -0.574, lwd = 2)
0.000 | 0.000 |
0.574 | 0.819 |
0.000 | 0.000 |
0.819 | -0.574 |
Nella figura, le due frecce rappresentano gli assi ruotati. La rotazione di \(-35^{\circ}\) ha effettivamente avvicinato gli assi ai punti del diagramma. Se usiamo dunque il valore \(\phi = -35^{\circ}\) nella matrice di rotazione, possiamo calcolare le saturazioni fattoriali della soluzione ruotata \(\hat{\boldsymbol{\Lambda}}^* = \hat{\boldsymbol{\Lambda}} \textbf{T}\).
Le saturazioni fattoriali ruotate corrispondono alla proiezione ortogonale dei punti sugli assi ruotati:
<- -35
angle <- angle * pi / 180
rad <- matrix(c(
T cos(rad), -sin(rad),
sin(rad), cos(rad)
ncol = 2, byrow = TRUE)
), round(f.pc$load %*% T, 3)
K | 0.927 | 0.367 |
I | -0.037 | 0.959 |
H | 0.980 | -0.031 |
L | 0.916 | 0.385 |
J | 0.194 | 0.950 |
La soluzione ottenuta in questo modo riproduce quanto riportato da {cite:t}rencher10methods
.
37.3.4 Medodi di rotazione ortogonale
Un tipo di rotazione ortogonale spesso utilizzata è la rotazione Varimax (Kaiser, 1958). La matrice \(\hat{\boldsymbol{\Lambda}}\) è semplificata in modo tale che le varianze dei quadrati degli elementi \(\lambda_{ij}\) appartenenti a colonne diverse di \(\hat{\boldsymbol{\Lambda}}\) siano massime. Se le saturazioni fattoriali in una colonna di \(\hat{\boldsymbol{\Lambda}}\) sono simili tra loro, la varianza sarà prossima a zero. Tale varianza è tanto più grande quanto più i quadrati degli elementi \(\lambda_{ij}\) assumono valori prossimi a \(0\) e \(1\). Amplificando le correlazioni più alte e riducendo quelle più basse, la rotazione Varimax agevola l’interpretazione di ciascun fattore.
Usando la funzione factanal()
del modulo R base, la rotazione Varimax può essere applicata alla soluzione ottenuta mediante il metodo di massima verosimiglianza. Usando le funzioni principal()
e factor.pa()
disponibili nel pacchetto psych
, la rotazione Varimax può essere applicata alle soluzioni ottenute mediante il metodo delle componenti principali e il metodo del fattore principale.
Ad esempio, usando il metodo delle componenti principali otteniamo:
<- principal(R, 2, n.obs = 7, rotate = "varimax")
f_pc f_pc
Principal Components Analysis
Call: principal(r = R, nfactors = 2, rotate = "varimax", n.obs = 7)
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 h2 u2 com
K 0.95 0.30 0.99 0.0067 1.2
I 0.03 0.96 0.92 0.0792 1.0
H 0.97 -0.10 0.96 0.0391 1.0
L 0.94 0.32 0.99 0.0135 1.2
J 0.26 0.93 0.94 0.0597 1.2
RC1 RC2
SS loadings 2.81 1.99
Proportion Var 0.56 0.40
Cumulative Var 0.56 0.96
Proportion Explained 0.58 0.42
Cumulative Proportion 0.58 1.00
Mean item complexity = 1.1
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is 0.03
with the empirical chi square 0.12 with prob < 0.73
Fit based upon off diagonal values = 1
Un altro metodo di rotazione ortogonale è il metodo Quartimax (Neuhaus e Wringley, 1954), il quale opera una semplificazione della matrice \(\hat{\boldsymbol{\Lambda}}\) massimizzando le covarianze tra i quadrati degli elementi \(\lambda_{ij}\) appartenenti a righe diverse, subordinatamente alla condizione che la varianza delle righe rimanga inalterata.
37.3.5 Metodi di Rotazione Obliqua
Il termine “rotazione obliqua” può sembrare inappropriato, in quanto la rotazione implica generalmente una trasformazione ortogonale che preserva le distanze. Tuttavia, come evidenziato da {cite:t}rencher10methods
, un’espressione più corretta potrebbe essere “trasformazione obliqua”. Nonostante ciò, l’uso comune ha consolidato il termine “rotazione obliqua”.
Nel contesto della rotazione obliqua, gli assi della soluzione ruotata non sono costretti a rimanere ortogonali tra loro, permettendo così un allineamento più diretto agli agglomerati di punti nello spazio delle saturazioni fattoriali. Questo tipo di trasformazione facilita l’interpretazione dei fattori in presenza di correlazioni tra di essi.
Esistono diversi approcci analitici per realizzare una rotazione obliqua. Ad esempio, il metodo Direct Oblimin, sviluppato da Jennrich e Sampson nel 1966, utilizza il seguente criterio:
\[ \sum_{ij} \left(\sum_v \lambda_i^2 \lambda_j^2 - w \frac{1}{p} \sum_v \lambda_i^2 \sum_v \lambda_j^2\right) \]
Qui, \(\sum_{ij}\) rappresenta la somma su tutte le coppie di fattori \(ij\). Il processo prevede una minimizzazione, al contrario della massimizzazione tipica delle rotazioni ortogonali, riflettendo la ricerca di una soluzione che minimizzi la correlazione ridondante tra i fattori, mantenendo al contempo chiarezza interpretativa.
37.4 Matrice dei Pesi Fattoriali e Matrice di Struttura
37.4.1 Rotazione Ortogonale
Nel contesto della rotazione ortogonale, i fattori rimangono incorrelati tra loro. Consideriamo il caso di due fattori latenti non correlati (\(\xi_1\) e \(\xi_2\)) e quattro variabili manifeste (\(y_1, y_2, y_3, y_4\)). I coefficienti \(\lambda_{11}, \lambda_{12}, \lambda_{13}, \lambda_{14}\) rappresentano le saturazioni fattoriali delle variabili nel primo fattore, mentre \(\lambda_{21}, \lambda_{22}, \lambda_{23}, \lambda_{24}\) sono quelle nel secondo fattore. In un modello di percorso, la correlazione tra due variabili è calcolata come la somma di tutti i percorsi validi che le collegano. Se i fattori comuni sono incorrelati, esiste un solo percorso valido che collega ciascuna variabile manifesta a ciascun fattore comune secondo le regole di Wright. Pertanto, le correlazioni tra variabili manifeste e fattori comuni sono direttamente uguali alle saturazioni fattoriali. Queste saturazioni possono essere interpretate come i pesi beta di un modello di regressione multipla, indicando il contributo specifico di ciascun fattore comune nella varianza spiegata degli item (Tabachnick & Fidell, 2001).

37.4.2 Rotazione Obliqua
Nel caso della rotazione obliqua, i fattori comuni risultano correlati tra loro, rendendo la soluzione fattoriale più complessa. Pertanto, la matrice delle saturazioni fattoriali non riflette più direttamente le correlazioni tra variabili e fattori. Un modello di percorso in questa configurazione include almeno due percorsi validi che collegano ciascuna variabile manifesta a ciascun fattore comune. È necessario distinguere tra tre matrici diverse:
- Matrice Pattern (\(\hat{\boldsymbol{\Lambda}}\)): Conosciuta anche come matrice dei modelli, questa matrice rappresenta i coefficienti di regressione parziali delle variabili sulle dimensioni fattoriali, escludendo l’influenza degli altri fattori.
- Matrice di Struttura: Rappresenta le correlazioni complessive tra le variabili manifeste e i fattori, considerando sia gli effetti diretti che quelli indiretti dei fattori correlati.
- Matrice di Intercorrelazione Fattoriale (\(\hat{\boldsymbol{\Phi}}\)): Indica le correlazioni tra i fattori stessi.
In un modello di percorso con rotazione obliqua, gli assi che rappresentano i fattori non sono ortogonali, il che significa che i fattori sono correlati. Le variabili manifeste sono quindi collegate ai fattori attraverso percorsi che includono effetti diretti e indiretti. Ad esempio, per la variabile \(y_1\) e il fattore \(\xi_1\), i percorsi includono una freccia causale \(\lambda_{11}\) per l’effetto diretto e un percorso indiretto rappresentato dal prodotto \(\lambda_{21}\phi_{12}\). L’analisi dei percorsi dimostra che la correlazione tra \(\xi_1\) e \(y_1\) è la somma dei valori numerici di questi percorsi validi, ovvero \(\lambda_{11} + \lambda_{21} \phi_{12}\).

Per illustrare la rotazione obliqua, utilizziamo i dati discussi da {cite:t}rencher10methods
. Si consideri la matrice di correlazione presentata qui sotto.
<- matrix(
R c(
1.00, 0.735, 0.711, 0.704,
0.735, 1.00, 0.693, 0.709,
0.711, 0.693, 1.00, 0.839,
0.704, 0.709, 0.839, 1.00
),ncol = 4,
byrow = TRUE
) R
1.000 | 0.735 | 0.711 | 0.704 |
0.735 | 1.000 | 0.693 | 0.709 |
0.711 | 0.693 | 1.000 | 0.839 |
0.704 | 0.709 | 0.839 | 1.000 |
Iniziamo calcolando la soluzione a due fattori mediante il metodo delle componenti principali e una rotazione Varimax (ovvero, ortogonale). Otteniamo le seguenti saturazioni fattoriali.
<- principal(R, 2, rotate = "varimax")
f1_pc f1_pc
Principal Components Analysis
Call: principal(r = R, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 h2 u2 com
1 0.50 0.78 0.86 0.140 1.7
2 0.47 0.81 0.88 0.124 1.6
3 0.90 0.33 0.92 0.078 1.3
4 0.89 0.35 0.92 0.083 1.3
RC1 RC2
SS loadings 2.08 1.50
Proportion Var 0.52 0.37
Cumulative Var 0.52 0.89
Proportion Explained 0.58 0.42
Cumulative Proportion 0.58 1.00
Mean item complexity = 1.5
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is 0.06
Fit based upon off diagonal values = 0.99
Si noti che i due fattori non sono molto distinti. Consideriamo dunque la soluzione prodotta da una rotazione obliqua. Usiamo qui l’algoritmo Oblimin.
<- principal(R, 2, rotate = "oblimin") pr_oblimin
La matrice \(\hat{\boldsymbol{\Lambda}}\) delle saturazioni fattoriali si ricava come indicato di seguito.
cbind(pr_oblimin$load[, 1], pr_oblimin$load[, 2])
0.0321 | 0.9019 |
-0.0254 | 0.9556 |
0.9686 | -0.0110 |
0.9473 | 0.0133 |
La matrice \(\hat{\boldsymbol{\Phi}}\) di inter-correlazione fattoriale è la seguente.
$Phi pr_oblimin
TC1 | TC2 | |
---|---|---|
TC1 | 1.000 | 0.787 |
TC2 | 0.787 | 1.000 |
La matrice di struttura, che riporta le correlazioni tra indicatori e fattori comuni, si ottiene pre-moltiplicando la matrice \(\boldsymbol{\Lambda}\) delle saturazioni fattoriali alla matrice \(\boldsymbol{\Phi}\) di inter-correlazione fattoriale.
\[ \text{matrice di struttura} = \boldsymbol{\Lambda}\boldsymbol{\Phi}. \]
Per esempio, la correlazione tra la prima variabile manifesta e il primo fattore si ottiene nel modo seguente.
$load[1, 1] + pr_oblimin$load[1, 2] * pr_oblimin$Phi[2, 1] pr_oblimin
L’intera matrice di struttura si può trovare eseguendo la moltiplicazione \(\boldsymbol{\Lambda}\boldsymbol{\Phi}\).
$load %*% pr_oblimin$Phi %>%
pr_obliminround(3)
TC1 | TC2 |
---|---|
0.742 | 0.927 |
0.727 | 0.936 |
0.960 | 0.751 |
0.958 | 0.759 |
37.5 Esempio con semTools
Presento qui un esempio di uso di vari metodi di estrazione fattoriale. Tra tali metodi, la rotazione obliqua Geomin è molto popolare ed è il default di M-Plus.
Iniziamo a caricare il pacchetto semTools
.
suppressPackageStartupMessages(library("semTools"))
Eseguiamo l’analisi fattoriale esplorativa del classico set di dati di Holzinger e Swineford (1939) il quale è costituito dai punteggi dei test di abilità mentale di bambini di seconda e terza media di due scuole diverse (Pasteur e Grant-White). Nel set di dati originale (disponibile nel pacchetto MBESS
), sono forniti i punteggi di 26 test. Tuttavia, un sottoinsieme più piccolo con 9 variabili è più ampiamente utilizzato in letteratura. Questi sono i dati qui usati.
Nel presente esempio, verrà eseguita l’analisi fattoriale esplorativa con l’estrazione di tre fattori. Il metodo di estrazione è mlr
:
maximum likelihood estimation with robust (Huber-White) standard errors and a scaled test statistic that is (asymptotically) equal to the Yuan-Bentler test statistic. For both complete and incomplete data.
La soluzione iniziale non è ruotata.
<- efaUnrotate(
unrotated
HolzingerSwineford1939, nf = 3,
varList = paste0("x", 1:9),
estimator = "mlr"
)<- summary(unrotated)
out print(out)
lavaan 0.6-19 ended normally after 217 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 36
Number of observations 301
Model Test User Model:
Standard Scaled
Test Statistic 22.897 23.864
Degrees of freedom 12 12
P-value (Chi-square) 0.029 0.021
Scaling correction factor 0.959
Yuan-Bentler correction (Mplus variant)
Parameter Estimates:
Standard errors Sandwich
Information bread Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
factor1 =~
x1 (l1_1) 0.653 0.083 7.909 0.000
x2 (l2_1) 0.353 0.079 4.481 0.000
x3 (l3_1) 0.415 0.086 4.832 0.000
x4 (l4_1) 0.926 0.067 13.762 0.000
x5 (l5_1) 1.014 0.067 15.176 0.000
x6 (l6_1) 0.868 0.062 13.887 0.000
x7 (l7_1) 0.283 0.091 3.113 0.002
x8 (l8_1) 0.340 0.083 4.095 0.000
x9 (l9_1) 0.460 0.078 5.881 0.000
factor2 =~
x1 (l1_2) 0.349 0.124 2.815 0.005
x2 (l2_2) 0.242 0.159 1.523 0.128
x3 (l3_2) 0.497 0.132 3.767 0.000
x4 (l4_2) -0.337 0.067 -5.058 0.000
x5 (l5_2) -0.461 0.077 -6.009 0.000
x6 (l6_2) -0.280 0.057 -4.908 0.000
x7 (l7_2) 0.372 0.188 1.976 0.048
x8 (l8_2) 0.510 0.133 3.831 0.000
x9 (l9_2) 0.489 0.066 7.416 0.000
factor3 =~
x1 (l1_3) -0.338 0.103 -3.275 0.001
x2 (l2_3) -0.405 0.092 -4.401 0.000
x3 (l3_3) -0.404 0.120 -3.355 0.001
x4 (l4_3) 0.049 0.098 0.503 0.615
x5 (l5_3) 0.122 0.105 1.154 0.248
x6 (l6_3) -0.000 0.076 -0.003 0.998
x7 (l7_3) 0.609 0.125 4.863 0.000
x8 (l8_3) 0.409 0.143 2.853 0.004
x9 (l9_3) 0.112 0.123 0.915 0.360
Covariances:
Estimate Std.Err z-value P(>|z|)
factor1 ~~
factor2 0.000
factor3 0.000
factor2 ~~
factor3 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
factor1 1.000
factor2 1.000
factor3 1.000
.x1 0.696 0.113 6.184 0.000
.x2 1.035 0.106 9.803 0.000
.x3 0.692 0.097 7.132 0.000
.x4 0.377 0.053 7.170 0.000
.x5 0.403 0.064 6.303 0.000
.x6 0.365 0.046 7.984 0.000
.x7 0.594 0.148 4.014 0.000
.x8 0.479 0.099 4.842 0.000
.x9 0.551 0.065 8.518 0.000
Constraints:
|Slack|
0-(1_2*1_1+2_2*2_1+3_2*3_1+4_2*4_1+5_2*5_ 0.000
0-(1_3*1_1+2_3*2_1+3_3*3_1+4_3*4_1+5_3*5_ 0.000
0-(1_3*1_2+2_3*2_2+3_3*3_2+4_3*4_2+5_3*5_ 0.000
Si noti che, in assenza di rotazione, è impossibile assegnare un significato ai fattori comuni.
37.5.1 Orthogonal varimax
Utilizziamo ora la rotazione ortogonale Varimax.
<- orthRotate(
out_varimax
unrotated, method = "varimax"
)<- summary(out_varimax, sort = FALSE, suppress = 0.3)
out print(out)
Standardized Rotated Factor Loadings
factor1 factor2 factor3
x1 0.320* 0.607*
x2 0.481*
x3 0.662*
x4 0.838*
x5 0.867*
x6 0.815*
x7 0.695*
x8 0.704*
x9 0.409* 0.511*
Factor Correlation
factor1 factor2 factor3
factor1 1 0 0
factor2 0 1 0
factor3 0 0 1
Method of rotation: varimax
Test Statistics for Standardized Rotated Factor Loadings
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.320 0.055 5.799 0.000 0.212 0.428
2 factor1 =~ x2 0.135 0.063 2.151 0.031 0.012 0.259
3 factor1 =~ x3 0.080 0.049 1.622 0.105 -0.017 0.176
4 factor1 =~ x4 0.838 0.028 30.193 0.000 0.784 0.892
5 factor1 =~ x5 0.867 0.024 36.189 0.000 0.820 0.914
6 factor1 =~ x6 0.815 0.024 33.939 0.000 0.768 0.862
7 factor1 =~ x7 0.102 0.049 2.058 0.040 0.005 0.199
8 factor1 =~ x8 0.078 0.048 1.617 0.106 -0.016 0.172
9 factor1 =~ x9 0.170 0.053 3.222 0.001 0.067 0.273
10 factor2 =~ x1 0.607 0.075 8.138 0.000 0.461 0.753
11 factor2 =~ x2 0.481 0.067 7.184 0.000 0.350 0.612
12 factor2 =~ x3 0.662 0.058 11.499 0.000 0.549 0.775
13 factor2 =~ x4 0.113 0.043 2.615 0.009 0.028 0.198
14 factor2 =~ x5 0.032 0.040 0.802 0.422 -0.047 0.111
15 factor2 =~ x6 0.162 0.042 3.855 0.000 0.079 0.244
16 factor2 =~ x7 -0.062 0.047 -1.341 0.180 -0.154 0.029
17 factor2 =~ x8 0.174 0.082 2.117 0.034 0.013 0.336
18 factor2 =~ x9 0.409 0.079 5.173 0.000 0.254 0.564
19 factor3 =~ x1 0.130 0.066 1.978 0.048 0.001 0.259
20 factor3 =~ x2 -0.041 0.071 -0.578 0.563 -0.179 0.098
21 factor3 =~ x3 0.113 0.049 2.324 0.020 0.018 0.209
22 factor3 =~ x4 0.077 0.040 1.916 0.055 -0.002 0.155
23 factor3 =~ x5 0.070 0.042 1.669 0.095 -0.012 0.153
24 factor3 =~ x6 0.066 0.038 1.715 0.086 -0.009 0.141
25 factor3 =~ x7 0.695 0.092 7.591 0.000 0.516 0.875
26 factor3 =~ x8 0.704 0.083 8.520 0.000 0.542 0.865
27 factor3 =~ x9 0.511 0.065 7.885 0.000 0.384 0.638
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.320 0.055 5.799 0.000 0.212 0.428
2 factor1 =~ x2 0.135 0.063 2.151 0.031 0.012 0.259
3 factor1 =~ x3 0.080 0.049 1.622 0.105 -0.017 0.176
4 factor1 =~ x4 0.838 0.028 30.193 0.000 0.784 0.892
5 factor1 =~ x5 0.867 0.024 36.189 0.000 0.820 0.914
6 factor1 =~ x6 0.815 0.024 33.939 0.000 0.768 0.862
7 factor1 =~ x7 0.102 0.049 2.058 0.040 0.005 0.199
8 factor1 =~ x8 0.078 0.048 1.617 0.106 -0.016 0.172
9 factor1 =~ x9 0.170 0.053 3.222 0.001 0.067 0.273
10 factor2 =~ x1 0.607 0.075 8.138 0.000 0.461 0.753
11 factor2 =~ x2 0.481 0.067 7.184 0.000 0.350 0.612
12 factor2 =~ x3 0.662 0.058 11.499 0.000 0.549 0.775
13 factor2 =~ x4 0.113 0.043 2.615 0.009 0.028 0.198
14 factor2 =~ x5 0.032 0.040 0.802 0.422 -0.047 0.111
15 factor2 =~ x6 0.162 0.042 3.855 0.000 0.079 0.244
16 factor2 =~ x7 -0.062 0.047 -1.341 0.180 -0.154 0.029
17 factor2 =~ x8 0.174 0.082 2.117 0.034 0.013 0.336
18 factor2 =~ x9 0.409 0.079 5.173 0.000 0.254 0.564
19 factor3 =~ x1 0.130 0.066 1.978 0.048 0.001 0.259
20 factor3 =~ x2 -0.041 0.071 -0.578 0.563 -0.179 0.098
21 factor3 =~ x3 0.113 0.049 2.324 0.020 0.018 0.209
22 factor3 =~ x4 0.077 0.040 1.916 0.055 -0.002 0.155
23 factor3 =~ x5 0.070 0.042 1.669 0.095 -0.012 0.153
24 factor3 =~ x6 0.066 0.038 1.715 0.086 -0.009 0.141
25 factor3 =~ x7 0.695 0.092 7.591 0.000 0.516 0.875
26 factor3 =~ x8 0.704 0.083 8.520 0.000 0.542 0.865
27 factor3 =~ x9 0.511 0.065 7.885 0.000 0.384 0.638
37.5.2 Orthogonal Quartimin
Un metodo alternativo per la rotazione ortogonale è Quartimin.
<- orthRotate(
out_quartimin
unrotated, method = "quartimin"
)<- summary(out_quartimin, sort = FALSE, suppress = 0.3)
out print(out)
Standardized Rotated Factor Loadings
factor1 factor2 factor3
x1 0.353* 0.590*
x2 0.474*
x3 0.657*
x4 0.844*
x5 0.869*
x6 0.823*
x7 0.692*
x8 0.702*
x9 0.397* 0.508*
Factor Correlation
factor1 factor2 factor3
factor1 1 0 0
factor2 0 1 0
factor3 0 0 1
Method of rotation: Quartimin
Test Statistics for Standardized Rotated Factor Loadings
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.353 0.062 5.720 0.000 0.232 0.473
2 factor1 =~ x2 0.158 0.066 2.375 0.018 0.028 0.288
3 factor1 =~ x3 0.115 0.057 2.015 0.044 0.003 0.226
4 factor1 =~ x4 0.844 0.027 30.814 0.000 0.790 0.898
5 factor1 =~ x5 0.869 0.023 37.224 0.000 0.823 0.914
6 factor1 =~ x6 0.823 0.024 35.026 0.000 0.777 0.869
7 factor1 =~ x7 0.116 0.054 2.161 0.031 0.011 0.222
8 factor1 =~ x8 0.104 0.054 1.914 0.056 -0.003 0.210
9 factor1 =~ x9 0.202 0.059 3.403 0.001 0.086 0.319
10 factor2 =~ x1 0.590 0.078 7.523 0.000 0.436 0.743
11 factor2 =~ x2 0.474 0.068 6.935 0.000 0.340 0.608
12 factor2 =~ x3 0.657 0.059 11.204 0.000 0.542 0.771
13 factor2 =~ x4 0.072 0.041 1.748 0.080 -0.009 0.152
14 factor2 =~ x5 -0.010 0.039 -0.263 0.793 -0.087 0.066
15 factor2 =~ x6 0.122 0.040 3.008 0.003 0.042 0.201
16 factor2 =~ x7 -0.071 0.048 -1.465 0.143 -0.166 0.024
17 factor2 =~ x8 0.167 0.090 1.849 0.064 -0.010 0.343
18 factor2 =~ x9 0.397 0.087 4.581 0.000 0.227 0.567
19 factor3 =~ x1 0.124 0.071 1.740 0.082 -0.016 0.264
20 factor3 =~ x2 -0.042 0.074 -0.574 0.566 -0.187 0.102
21 factor3 =~ x3 0.114 0.054 2.093 0.036 0.007 0.221
22 factor3 =~ x4 0.056 0.037 1.503 0.133 -0.017 0.128
23 factor3 =~ x5 0.048 0.038 1.263 0.207 -0.027 0.123
24 factor3 =~ x6 0.046 0.034 1.347 0.178 -0.021 0.112
25 factor3 =~ x7 0.692 0.093 7.477 0.000 0.511 0.874
26 factor3 =~ x8 0.702 0.084 8.331 0.000 0.537 0.867
27 factor3 =~ x9 0.508 0.070 7.298 0.000 0.371 0.644
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.353 0.062 5.720 0.000 0.232 0.473
2 factor1 =~ x2 0.158 0.066 2.375 0.018 0.028 0.288
3 factor1 =~ x3 0.115 0.057 2.015 0.044 0.003 0.226
4 factor1 =~ x4 0.844 0.027 30.814 0.000 0.790 0.898
5 factor1 =~ x5 0.869 0.023 37.224 0.000 0.823 0.914
6 factor1 =~ x6 0.823 0.024 35.026 0.000 0.777 0.869
7 factor1 =~ x7 0.116 0.054 2.161 0.031 0.011 0.222
8 factor1 =~ x8 0.104 0.054 1.914 0.056 -0.003 0.210
9 factor1 =~ x9 0.202 0.059 3.403 0.001 0.086 0.319
10 factor2 =~ x1 0.590 0.078 7.523 0.000 0.436 0.743
11 factor2 =~ x2 0.474 0.068 6.935 0.000 0.340 0.608
12 factor2 =~ x3 0.657 0.059 11.204 0.000 0.542 0.771
13 factor2 =~ x4 0.072 0.041 1.748 0.080 -0.009 0.152
14 factor2 =~ x5 -0.010 0.039 -0.263 0.793 -0.087 0.066
15 factor2 =~ x6 0.122 0.040 3.008 0.003 0.042 0.201
16 factor2 =~ x7 -0.071 0.048 -1.465 0.143 -0.166 0.024
17 factor2 =~ x8 0.167 0.090 1.849 0.064 -0.010 0.343
18 factor2 =~ x9 0.397 0.087 4.581 0.000 0.227 0.567
19 factor3 =~ x1 0.124 0.071 1.740 0.082 -0.016 0.264
20 factor3 =~ x2 -0.042 0.074 -0.574 0.566 -0.187 0.102
21 factor3 =~ x3 0.114 0.054 2.093 0.036 0.007 0.221
22 factor3 =~ x4 0.056 0.037 1.503 0.133 -0.017 0.128
23 factor3 =~ x5 0.048 0.038 1.263 0.207 -0.027 0.123
24 factor3 =~ x6 0.046 0.034 1.347 0.178 -0.021 0.112
25 factor3 =~ x7 0.692 0.093 7.477 0.000 0.511 0.874
26 factor3 =~ x8 0.702 0.084 8.331 0.000 0.537 0.867
27 factor3 =~ x9 0.508 0.070 7.298 0.000 0.371 0.644
37.5.3 Oblique Quartimin
L’algoritmo Quartimin può anche essere usato per una soluzione obliqua.
<- oblqRotate(
out_oblq
unrotated, method = "quartimin"
)<- summary(out_oblq, sort = FALSE, suppress = 0.3)
out print(out)
Standardized Rotated Factor Loadings
factor1 factor2 factor3
x1 0.602*
x2 0.505*
x3 0.689*
x4 0.840*
x5 0.888*
x6 0.808*
x7 0.723*
x8 0.702*
x9 0.366* 0.463*
Factor Correlation
factor1 factor2 factor3
factor1 1.000 0.326 0.216
factor2 0.326 1.000 0.270
factor3 0.216 0.270 1.000
Method of rotation: Quartimin
Test Statistics for Standardized Rotated Factor Loadings
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.191 0.064 2.965 0.003 0.065 0.317
2 factor1 =~ x2 0.044 0.066 0.665 0.506 -0.085 0.172
3 factor1 =~ x3 -0.070 0.034 -2.031 0.042 -0.137 -0.002
4 factor1 =~ x4 0.840 0.033 25.622 0.000 0.776 0.905
5 factor1 =~ x5 0.888 0.027 32.583 0.000 0.835 0.942
6 factor1 =~ x6 0.808 0.028 28.441 0.000 0.752 0.863
7 factor1 =~ x7 0.044 0.037 1.179 0.238 -0.029 0.116
8 factor1 =~ x8 -0.033 0.036 -0.916 0.360 -0.103 0.037
9 factor1 =~ x9 0.035 0.048 0.728 0.467 -0.059 0.129
10 factor2 =~ x1 0.602 0.086 7.003 0.000 0.434 0.771
11 factor2 =~ x2 0.505 0.071 7.163 0.000 0.367 0.644
12 factor2 =~ x3 0.689 0.056 12.344 0.000 0.580 0.799
13 factor2 =~ x4 0.022 0.045 0.483 0.629 -0.067 0.110
14 factor2 =~ x5 -0.067 0.036 -1.890 0.059 -0.137 0.002
15 factor2 =~ x6 0.078 0.041 1.887 0.059 -0.003 0.158
16 factor2 =~ x7 -0.152 0.037 -4.059 0.000 -0.225 -0.078
17 factor2 =~ x8 0.104 0.109 0.960 0.337 -0.109 0.317
18 factor2 =~ x9 0.366 0.097 3.780 0.000 0.176 0.556
19 factor3 =~ x1 0.031 0.062 0.500 0.617 -0.090 0.152
20 factor3 =~ x2 -0.117 0.066 -1.776 0.076 -0.245 0.012
21 factor3 =~ x3 0.023 0.039 0.587 0.557 -0.054 0.100
22 factor3 =~ x4 0.005 0.042 0.128 0.898 -0.076 0.087
23 factor3 =~ x5 0.008 0.035 0.216 0.829 -0.061 0.076
24 factor3 =~ x6 -0.011 0.030 -0.362 0.717 -0.070 0.048
25 factor3 =~ x7 0.723 0.087 8.328 0.000 0.553 0.893
26 factor3 =~ x8 0.702 0.098 7.137 0.000 0.509 0.894
27 factor3 =~ x9 0.463 0.075 6.211 0.000 0.317 0.609
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.191 0.064 2.965 0.003 0.065 0.317
2 factor1 =~ x2 0.044 0.066 0.665 0.506 -0.085 0.172
3 factor1 =~ x3 -0.070 0.034 -2.031 0.042 -0.137 -0.002
4 factor1 =~ x4 0.840 0.033 25.622 0.000 0.776 0.905
5 factor1 =~ x5 0.888 0.027 32.583 0.000 0.835 0.942
6 factor1 =~ x6 0.808 0.028 28.441 0.000 0.752 0.863
7 factor1 =~ x7 0.044 0.037 1.179 0.238 -0.029 0.116
8 factor1 =~ x8 -0.033 0.036 -0.916 0.360 -0.103 0.037
9 factor1 =~ x9 0.035 0.048 0.728 0.467 -0.059 0.129
10 factor2 =~ x1 0.602 0.086 7.003 0.000 0.434 0.771
11 factor2 =~ x2 0.505 0.071 7.163 0.000 0.367 0.644
12 factor2 =~ x3 0.689 0.056 12.344 0.000 0.580 0.799
13 factor2 =~ x4 0.022 0.045 0.483 0.629 -0.067 0.110
14 factor2 =~ x5 -0.067 0.036 -1.890 0.059 -0.137 0.002
15 factor2 =~ x6 0.078 0.041 1.887 0.059 -0.003 0.158
16 factor2 =~ x7 -0.152 0.037 -4.059 0.000 -0.225 -0.078
17 factor2 =~ x8 0.104 0.109 0.960 0.337 -0.109 0.317
18 factor2 =~ x9 0.366 0.097 3.780 0.000 0.176 0.556
19 factor3 =~ x1 0.031 0.062 0.500 0.617 -0.090 0.152
20 factor3 =~ x2 -0.117 0.066 -1.776 0.076 -0.245 0.012
21 factor3 =~ x3 0.023 0.039 0.587 0.557 -0.054 0.100
22 factor3 =~ x4 0.005 0.042 0.128 0.898 -0.076 0.087
23 factor3 =~ x5 0.008 0.035 0.216 0.829 -0.061 0.076
24 factor3 =~ x6 -0.011 0.030 -0.362 0.717 -0.070 0.048
25 factor3 =~ x7 0.723 0.087 8.328 0.000 0.553 0.893
26 factor3 =~ x8 0.702 0.098 7.137 0.000 0.509 0.894
27 factor3 =~ x9 0.463 0.075 6.211 0.000 0.317 0.609
37.5.4 Orthogonal Geomin
Consideriamo ora la rotazione Geomin. L’algoritmo Geomin fornisce un metodo di rotazione che riduce al minimo la media geometrica delle saturazioni fattoriali innalzate al quadrato. Qui è usato per ottenere una soluzione ortogonale.
<- orthRotate(
out_geomin_orh
unrotated, method = "geomin"
)<- summary(out_geomin_orh, sort = FALSE, suppress = 0.3)
out print(out)
Standardized Rotated Factor Loadings
factor1 factor2 factor3
x1 0.315* -0.621*
x2 -0.474*
x3 -0.671*
x4 0.838*
x5 0.867*
x6 0.814*
x7 0.696*
x8 0.677*
x9 0.456* -0.468*
Factor Correlation
factor1 factor2 factor3
factor1 1 0 0
factor2 0 1 0
factor3 0 0 1
Method of rotation: Geomin
Test Statistics for Standardized Rotated Factor Loadings
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.315 0.134 2.352 0.019 0.053 0.578
2 factor1 =~ x2 0.130 0.118 1.102 0.271 -0.101 0.360
3 factor1 =~ x3 0.074 0.123 0.599 0.549 -0.168 0.316
4 factor1 =~ x4 0.838 0.036 23.402 0.000 0.767 0.908
5 factor1 =~ x5 0.867 0.025 35.190 0.000 0.819 0.915
6 factor1 =~ x6 0.814 0.040 20.427 0.000 0.736 0.892
7 factor1 =~ x7 0.112 0.068 1.645 0.100 -0.021 0.245
8 factor1 =~ x8 0.085 0.063 1.341 0.180 -0.039 0.209
9 factor1 =~ x9 0.172 0.095 1.803 0.071 -0.015 0.359
10 factor2 =~ x1 0.053 0.061 0.868 0.386 -0.067 0.173
11 factor2 =~ x2 -0.099 0.070 -1.409 0.159 -0.237 0.039
12 factor2 =~ x3 0.033 0.048 0.698 0.485 -0.060 0.127
13 factor2 =~ x4 0.051 0.046 1.115 0.265 -0.039 0.140
14 factor2 =~ x5 0.054 0.061 0.878 0.380 -0.066 0.173
15 factor2 =~ x6 0.035 0.037 0.924 0.355 -0.039 0.108
16 factor2 =~ x7 0.696 0.090 7.702 0.000 0.519 0.874
17 factor2 =~ x8 0.677 0.088 7.660 0.000 0.504 0.850
18 factor2 =~ x9 0.456 0.073 6.261 0.000 0.314 0.599
19 factor3 =~ x1 -0.621 0.101 -6.148 0.000 -0.818 -0.423
20 factor3 =~ x2 -0.474 0.074 -6.414 0.000 -0.619 -0.329
21 factor3 =~ x3 -0.671 0.058 -11.658 0.000 -0.784 -0.558
22 factor3 =~ x4 -0.129 0.161 -0.800 0.424 -0.445 0.187
23 factor3 =~ x5 -0.048 0.174 -0.277 0.782 -0.389 0.293
24 factor3 =~ x6 -0.176 0.164 -1.071 0.284 -0.497 0.146
25 factor3 =~ x7 -0.021 0.059 -0.354 0.724 -0.137 0.095
26 factor3 =~ x8 -0.257 0.094 -2.720 0.007 -0.442 -0.072
27 factor3 =~ x9 -0.468 0.105 -4.472 0.000 -0.673 -0.263
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.315 0.134 2.352 0.019 0.053 0.578
2 factor1 =~ x2 0.130 0.118 1.102 0.271 -0.101 0.360
3 factor1 =~ x3 0.074 0.123 0.599 0.549 -0.168 0.316
4 factor1 =~ x4 0.838 0.036 23.402 0.000 0.767 0.908
5 factor1 =~ x5 0.867 0.025 35.190 0.000 0.819 0.915
6 factor1 =~ x6 0.814 0.040 20.427 0.000 0.736 0.892
7 factor1 =~ x7 0.112 0.068 1.645 0.100 -0.021 0.245
8 factor1 =~ x8 0.085 0.063 1.341 0.180 -0.039 0.209
9 factor1 =~ x9 0.172 0.095 1.803 0.071 -0.015 0.359
10 factor2 =~ x1 0.053 0.061 0.868 0.386 -0.067 0.173
11 factor2 =~ x2 -0.099 0.070 -1.409 0.159 -0.237 0.039
12 factor2 =~ x3 0.033 0.048 0.698 0.485 -0.060 0.127
13 factor2 =~ x4 0.051 0.046 1.115 0.265 -0.039 0.140
14 factor2 =~ x5 0.054 0.061 0.878 0.380 -0.066 0.173
15 factor2 =~ x6 0.035 0.037 0.924 0.355 -0.039 0.108
16 factor2 =~ x7 0.696 0.090 7.702 0.000 0.519 0.874
17 factor2 =~ x8 0.677 0.088 7.660 0.000 0.504 0.850
18 factor2 =~ x9 0.456 0.073 6.261 0.000 0.314 0.599
19 factor3 =~ x1 -0.621 0.101 -6.148 0.000 -0.818 -0.423
20 factor3 =~ x2 -0.474 0.074 -6.414 0.000 -0.619 -0.329
21 factor3 =~ x3 -0.671 0.058 -11.658 0.000 -0.784 -0.558
22 factor3 =~ x4 -0.129 0.161 -0.800 0.424 -0.445 0.187
23 factor3 =~ x5 -0.048 0.174 -0.277 0.782 -0.389 0.293
24 factor3 =~ x6 -0.176 0.164 -1.071 0.284 -0.497 0.146
25 factor3 =~ x7 -0.021 0.059 -0.354 0.724 -0.137 0.095
26 factor3 =~ x8 -0.257 0.094 -2.720 0.007 -0.442 -0.072
27 factor3 =~ x9 -0.468 0.105 -4.472 0.000 -0.673 -0.263
37.5.5 Oblique Geomin
La rotazione Geomin può anche essere usata per ottenere una soluzione obliqua.
<- oblqRotate(
out_geomin_obl
unrotated, method = "geomin"
)<- summary(out_geomin_obl, sort = FALSE, suppress = 0.3)
out print(out)
Standardized Rotated Factor Loadings
factor1 factor2 factor3
x1 -0.604*
x2 -0.507*
x3 -0.691*
x4 0.839*
x5 0.887*
x6 0.806*
x7 0.726*
x8 0.703*
x9 0.463* -0.368*
Factor Correlation
factor1 factor2 factor3
factor1 1.000 0.230 -0.327
factor2 0.230 1.000 -0.278
factor3 -0.327 -0.278 1.000
Method of rotation: Geomin
Test Statistics for Standardized Rotated Factor Loadings
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.188 0.070 2.670 0.008 0.050 0.326
2 factor1 =~ x2 0.044 0.054 0.806 0.420 -0.063 0.150
3 factor1 =~ x3 -0.073 0.049 -1.467 0.142 -0.170 0.024
4 factor1 =~ x4 0.839 0.032 26.467 0.000 0.777 0.901
5 factor1 =~ x5 0.887 0.029 30.077 0.000 0.829 0.945
6 factor1 =~ x6 0.806 0.030 26.717 0.000 0.747 0.865
7 factor1 =~ x7 0.031 0.034 0.915 0.360 -0.036 0.099
8 factor1 =~ x8 -0.045 0.048 -0.948 0.343 -0.139 0.048
9 factor1 =~ x9 0.025 0.034 0.747 0.455 -0.041 0.091
10 factor2 =~ x1 0.029 0.051 0.567 0.571 -0.071 0.129
11 factor2 =~ x2 -0.119 0.072 -1.664 0.096 -0.260 0.021
12 factor2 =~ x3 0.020 0.037 0.538 0.591 -0.053 0.092
13 factor2 =~ x4 0.007 0.043 0.174 0.862 -0.076 0.091
14 factor2 =~ x5 0.010 0.036 0.285 0.775 -0.060 0.080
15 factor2 =~ x6 -0.009 0.030 -0.309 0.758 -0.068 0.049
16 factor2 =~ x7 0.726 0.072 10.065 0.000 0.585 0.868
17 factor2 =~ x8 0.703 0.118 5.963 0.000 0.472 0.934
18 factor2 =~ x9 0.463 0.080 5.810 0.000 0.307 0.619
19 factor3 =~ x1 -0.604 0.081 -7.438 0.000 -0.763 -0.445
20 factor3 =~ x2 -0.507 0.073 -6.983 0.000 -0.649 -0.364
21 factor3 =~ x3 -0.691 0.061 -11.373 0.000 -0.810 -0.572
22 factor3 =~ x4 -0.024 0.034 -0.702 0.482 -0.091 0.043
23 factor3 =~ x5 0.065 0.045 1.459 0.144 -0.022 0.153
24 factor3 =~ x6 -0.080 0.048 -1.679 0.093 -0.173 0.013
25 factor3 =~ x7 0.150 0.107 1.403 0.161 -0.060 0.360
26 factor3 =~ x8 -0.106 0.164 -0.645 0.519 -0.428 0.216
27 factor3 =~ x9 -0.368 0.133 -2.770 0.006 -0.629 -0.108
lhs op rhs std.loading se z p ci.lower ci.upper
1 factor1 =~ x1 0.188 0.070 2.670 0.008 0.050 0.326
2 factor1 =~ x2 0.044 0.054 0.806 0.420 -0.063 0.150
3 factor1 =~ x3 -0.073 0.049 -1.467 0.142 -0.170 0.024
4 factor1 =~ x4 0.839 0.032 26.467 0.000 0.777 0.901
5 factor1 =~ x5 0.887 0.029 30.077 0.000 0.829 0.945
6 factor1 =~ x6 0.806 0.030 26.717 0.000 0.747 0.865
7 factor1 =~ x7 0.031 0.034 0.915 0.360 -0.036 0.099
8 factor1 =~ x8 -0.045 0.048 -0.948 0.343 -0.139 0.048
9 factor1 =~ x9 0.025 0.034 0.747 0.455 -0.041 0.091
10 factor2 =~ x1 0.029 0.051 0.567 0.571 -0.071 0.129
11 factor2 =~ x2 -0.119 0.072 -1.664 0.096 -0.260 0.021
12 factor2 =~ x3 0.020 0.037 0.538 0.591 -0.053 0.092
13 factor2 =~ x4 0.007 0.043 0.174 0.862 -0.076 0.091
14 factor2 =~ x5 0.010 0.036 0.285 0.775 -0.060 0.080
15 factor2 =~ x6 -0.009 0.030 -0.309 0.758 -0.068 0.049
16 factor2 =~ x7 0.726 0.072 10.065 0.000 0.585 0.868
17 factor2 =~ x8 0.703 0.118 5.963 0.000 0.472 0.934
18 factor2 =~ x9 0.463 0.080 5.810 0.000 0.307 0.619
19 factor3 =~ x1 -0.604 0.081 -7.438 0.000 -0.763 -0.445
20 factor3 =~ x2 -0.507 0.073 -6.983 0.000 -0.649 -0.364
21 factor3 =~ x3 -0.691 0.061 -11.373 0.000 -0.810 -0.572
22 factor3 =~ x4 -0.024 0.034 -0.702 0.482 -0.091 0.043
23 factor3 =~ x5 0.065 0.045 1.459 0.144 -0.022 0.153
24 factor3 =~ x6 -0.080 0.048 -1.679 0.093 -0.173 0.013
25 factor3 =~ x7 0.150 0.107 1.403 0.161 -0.060 0.360
26 factor3 =~ x8 -0.106 0.164 -0.645 0.519 -0.428 0.216
27 factor3 =~ x9 -0.368 0.133 -2.770 0.006 -0.629 -0.108
37.6 Interpretazione dei fattori latenti nell’analisi fattoriale
Nell’interpretare i fattori comuni latenti in un’analisi fattoriale, è cruciale scegliere tra la matrice pattern e la matrice struttura. Entrambe sono utili per l’interpretazione, ma forniscono informazioni diverse:
Matrice pattern:
- Mostra le saturazioni fattoriali dirette.
- Indica gli effetti diretti dei fattori latenti sulle variabili manifeste.
- Rivela quanto ciascun fattore contribuisce direttamente alla varianza di una variabile osservata.
- Fondamentale per comprendere il significato psicologico dei fattori.
Matrice struttura:
- Rappresenta le correlazioni tra fattori latenti e variabili osservate.
- Include sia gli effetti diretti che quelli indiretti.
- Descrive la covariazione complessiva tra fattori e variabili manifeste.
- Non distingue tra relazioni dirette e indirette.
Un fattore identificato nell’analisi fattoriale rappresenta una variabile latente univariata, ovvero una dimensione sottostante che cattura l’essenza di un fenomeno psicologico. L’interpretazione del fattore emerge dall’intersezione dei significati delle variabili che vi saturano.
Nel caso di rotazioni oblique, dove i fattori sono correlati, è essenziale interpretare ogni fattore come una dimensione psicologica distinta. Ad esempio, l’etichetta assegnata al fattore \(F_1\) deve essere concettualmente separata dal fenomeno rappresentato dal fattore \(F_2\), nonostante la loro correlazione.
Adottando questa strategia interpretativa, la matrice pattern diventa lo strumento principale per l’interpretazione. I suoi coefficienti riflettono gli effetti diretti dei fattori latenti sulle variabili manifeste, indicando un’influenza “causale” del fattore su tali variabili. La matrice struttura, invece, descrive le correlazioni complessive tra variabili manifeste e fattori, includendo sia relazioni dirette che indirette.
In conclusione, per un’interpretazione più accurata e teoricamente solida dei fattori latenti, è preferibile basarsi sulla matrice pattern, che fornisce informazioni specifiche sugli effetti diretti tra fattori comuni e variabili manifeste.
37.7 Session Info
sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: aarch64-apple-darwin20
Running under: macOS Sequoia 15.1.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.0
locale:
[1] C
time zone: Europe/Rome
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] GPArotation_2024.3-1 MASS_7.3-61 viridis_0.6.5
[4] viridisLite_0.4.2 ggpubr_0.6.0 ggExtra_0.10.1
[7] gridExtra_2.3 patchwork_1.3.0 bayesplot_1.11.1
[10] semTools_0.5-6 semPlot_1.1.6 lavaan_0.6-19
[13] psych_2.4.6.26 scales_1.3.0 markdown_1.13
[16] knitr_1.49 lubridate_1.9.3 forcats_1.0.0
[19] stringr_1.5.1 dplyr_1.1.4 purrr_1.0.2
[22] readr_2.1.5 tidyr_1.3.1 tibble_3.2.1
[25] ggplot2_3.5.1 tidyverse_2.0.0 here_1.0.1
loaded via a namespace (and not attached):
[1] rstudioapi_0.17.1 jsonlite_1.8.9 magrittr_2.0.3
[4] TH.data_1.1-2 estimability_1.5.1 farver_2.1.2
[7] nloptr_2.1.1 rmarkdown_2.29 vctrs_0.6.5
[10] Cairo_1.6-2 minqa_1.2.8 base64enc_0.1-3
[13] rstatix_0.7.2 htmltools_0.5.8.1 broom_1.0.7
[16] Formula_1.2-5 htmlwidgets_1.6.4 plyr_1.8.9
[19] sandwich_3.1-1 emmeans_1.10.5 zoo_1.8-12
[22] uuid_1.2-1 igraph_2.1.1 mime_0.12
[25] lifecycle_1.0.4 pkgconfig_2.0.3 Matrix_1.7-1
[28] R6_2.5.1 fastmap_1.2.0 shiny_1.9.1
[31] numDeriv_2016.8-1.1 digest_0.6.37 OpenMx_2.21.13
[34] fdrtool_1.2.18 colorspace_2.1-1 rprojroot_2.0.4
[37] Hmisc_5.2-0 fansi_1.0.6 timechange_0.3.0
[40] abind_1.4-8 compiler_4.4.2 withr_3.0.2
[43] glasso_1.11 htmlTable_2.4.3 backports_1.5.0
[46] carData_3.0-5 ggsignif_0.6.4 corpcor_1.6.10
[49] gtools_3.9.5 tools_4.4.2 pbivnorm_0.6.0
[52] foreign_0.8-87 zip_2.3.1 httpuv_1.6.15
[55] nnet_7.3-19 glue_1.8.0 quadprog_1.5-8
[58] promises_1.3.0 nlme_3.1-166 lisrelToR_0.3
[61] grid_4.4.2 pbdZMQ_0.3-13 checkmate_2.3.2
[64] cluster_2.1.6 reshape2_1.4.4 generics_0.1.3
[67] gtable_0.3.6 tzdb_0.4.0 data.table_1.16.2
[70] hms_1.1.3 car_3.1-3 utf8_1.2.4
[73] sem_3.1-16 pillar_1.9.0 IRdisplay_1.1
[76] rockchalk_1.8.157 later_1.3.2 splines_4.4.2
[79] cherryblossom_0.1.0 lattice_0.22-6 survival_3.7-0
[82] kutils_1.73 tidyselect_1.2.1 miniUI_0.1.1.1
[85] pbapply_1.7-2 airports_0.1.0 stats4_4.4.2
[88] xfun_0.49 qgraph_1.9.8 arm_1.14-4
[91] stringi_1.8.4 pacman_0.5.1 boot_1.3-31
[94] evaluate_1.0.1 codetools_0.2-20 mi_1.1
[97] cli_3.6.3 RcppParallel_5.1.9 IRkernel_1.3.2
[100] rpart_4.1.23 xtable_1.8-4 repr_1.1.7
[103] munsell_0.5.1 Rcpp_1.0.13-1 coda_0.19-4.1
[106] png_0.1-8 XML_3.99-0.17 parallel_4.4.2
[109] usdata_0.3.1 jpeg_0.1-10 lme4_1.1-35.5
[112] mvtnorm_1.3-2 openxlsx_4.2.7.1 crayon_1.5.3
[115] openintro_2.5.0 rlang_1.1.4 multcomp_1.4-26
[118] mnormt_2.1.1