here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(lavaan, semPlot, corrplot, tidyr, tidySEM, kableExtra)
30 Il modello multifattoriale
- calcolare e interpretare la correlazione parziale;
- capire la teoria dei due fattori;
- applicare e comprendere il metodo dell’annullamento della tetrade.
- Leggere il capitolo 6, Factor Analysis and Principal Component Analysis, del testo Principles of psychological assessment di Petersen (2024).
30.1 Fattori ortogonali
La teoria dei due fattori ha orientato per diversi anni le ricerche sull’intelligenza, finché Thurstone (1945) non propose una sua modifica, conosciuta come teoria multifattoriale. Secondo Thurstone la covariazione tra le variabili manifeste non può essere spiegata da un unico fattore generale. Invece è necessario ipotizzare l’azione causale di diversi fattori, definiti comuni, i quali si riferiscono solo ad alcune delle variabili considerate.
Il modello plurifattoriale assume che ciascuna variabile manifesta sia espressa come funzione lineare di un certo numero \(m\) di fattori comuni, \(\xi_1, \xi_2, \dots, \xi_m\), responsabili della correlazione con le altre variabili, e di un solo fattore specifico (termine d’errore), responsabile della variabilità della variabile stessa. Per \(p\) variabili manifeste, \(Y_1, Y_2, \dots, Y_p\), il modello fattoriale diventa quello indicato dal sistema di equazioni lineari descritto di seguito. Idealmente, \(m\) dovrebbe essere molto più piccolo di \(p\) così da consentire una descrizione parsimoniosa delle variabili manifeste in funzione di pochi fattori soggiacenti.
Le variabili manifeste \(Y\) sono indicizzate da \(i = 1, \dots, p.\) Le variabili latenti \(\xi\) (fattori) sono indicizzate da \(j = 1, \dots, m.\) I fattori specifici \(\delta\) sono indicizzati da \(i = 1, \dots, p.\) Le saturazioni fattoriali si distinguono dunque tramite due indici, \(i\) e \(j\): il primo indice si riferisce alle variabili manifeste, il secondo si riferisce ai fattori latenti.
Indichiamo con \(\mu_i\), con \(i=1, \dots, p\) le medie delle \(p\) variabili manifeste \(Y_1, Y_2, \dots, Y_p\). Se non vi è alcun effetto delle variabili comuni latenti, allora la variabile \(Y_{ijk}\), dove \(k\) è l’indice usato per i soggetti, sarà uguale a:
\[ \begin{equation} \begin{cases} Y_{1k} &= \mu_1 + \delta_{1k} \\ &\vdots\\ Y_{ik} &= \mu_i + \delta_{ik}\\ &\vdots\\ Y_{pk} &= \mu_p + \delta_{pk} \notag \end{cases} \end{equation} \]
Se invece le variabili manifeste rappresentano la somma dell’effetto causale di \(m\) fattori comuni e di \(p\) fattori specifici, allora possiamo scrivere:
\[ \begin{equation} \begin{cases} Y_1 - \mu_1 &= \lambda_{11}\xi_1 + \dots + \lambda_{1k}\xi_k \dots +\lambda_{1m}\xi_m + \delta_1 \\ &\vdots\\ Y_i - \mu_i &= \lambda_{i1}\xi_1 + \dots + \lambda_{ik}\xi_k \dots +\lambda_{im}\xi_m + \delta_i\\ &\vdots\\ Y_p - \mu_p &= \lambda_{p1}\xi_1 + \dots + \lambda_{pk}\xi_k \dots +\lambda_{pm}\xi_m + \delta_p \notag \end{cases} \end{equation} \]
Nel precedente sistema di equazioni lineari,
- \(\xi_j\), con \(j=1, \dots, m\), rappresenta la \(j\)-esima variabile inosservabile a fattore comune (ossia il \(j\)-esimo fattore comune a tutte le variabili \(Y_i\));
- \(\lambda_{ij}\) rappresenta il parametro, detto saturazione o peso fattoriale, che riflette l’importanza del \(j\)-esimo fattore comune nella composizione della \(i\)-esima variabile osservabile;
- \(\delta_i\) rappresenta il fattore specifico (o unico) di ogni variabile manifesta \(Y_i\).
In conclusione, secondo il modello multifattoriale, le variabili manifeste \(Y_i\), con \(i=1, \dots, p\), sono il risultato di una combinazione lineare di \(m < p\) fattori inosservabili ad esse comuni \(\xi_j\), con \(j=1, \dots, m\), e di \(p\) fattori specifici \(\delta_i\), con \(i=1, \dots, p\), anch’essi inosservabili e di natura residua.
30.1.1 Assunzioni del modello multifattoriale
Le variabili inosservabili a fattore comune \(\xi_j\), con \(j=1, \dots, m\), in quanto latenti, non possiedono unità di misura. Pertanto, per semplicità si assume che abbiano media zero, \(\mathbb{E}(\xi_j)=0\), abbiano varianza unitaria, \(\mathbb{V} (\xi_j)= \mathbb{E}(\xi_j^2) - [\mathbb{E}(\xi_j)]^2=1\), e siano incorrelate tra loro, \(Cov(\xi_j, \xi_h)=0\), con \(j, h = 1, \dots, m; \;j \neq h\). Si assume inoltre che le variabili a fattore specifico \(\delta_i\) siano tra loro incorrelate, \(Cov(\delta_i,\delta_k)=0\), con \(i, k = 1, \dots, p, \; i \neq k\), abbiano media zero, \(\mathbb{E}(\delta_i)=0\), e varianza uguale a \(\mathbb{V} (\delta_i) = \psi_{ii}\). La varianza \(\psi_{ii}\) è detta varianza specifica o unicità della \(i\)-esima variabile manifesta \(Y_i\). Si assume infine che i fattori specifici siano linearmente incorrelati con i fattori comuni, ovvero \(Cov(\xi_j, \delta_i)=0\) per ogni \(j=1, \dots, m\) e per ogni \(i=1\dots,p\).
30.1.2 Interpretazione dei parametri del modello
30.1.2.1 Covarianza tra variabili e fattori
Nell’ipotesi che le variabili \(Y_i\) abbiano media nulla, la covarianza tra \(Y_i\) e \(\xi_j\) è uguale alla saturazione fattoriale \(\lambda_{ij}\):
\[ \begin{equation} \begin{aligned} Cov(Y_i, \xi_j) &= \mathbb{E}(Y_i \xi_j)\notag\\ &=\mathbb{E}\left[(\lambda_{i1} \xi_1 + \dots + \lambda_{im} \xi_m + \delta_i)\xi_j \right]\notag\\ &= \lambda_{i1}\underbrace{\mathbb{E}(\xi_1\xi_j)}_{=0} + \dots + \lambda_{ij}\underbrace{\mathbb{E}(\xi_j^2)}_{=1} + \dots \notag\\ & \; + \lambda_{im}\underbrace{\mathbb{E}(\xi_m\xi_j)}_{=0} + \underbrace{\mathbb{E}(\delta_i \xi_j)}_{=0}\notag\\ &= \lambda_{ij}.\notag \end{aligned} \end{equation} \]
Anche nel modello multifattoriale, dunque, le saturazioni fattoriali rappresentano le covarianze tra le variabili e i fattori:
\[ Cov(Y_i, \xi_j) = \lambda_{ij} \qquad i=1, \dots, p; \quad j= 1, \dots, m. \]
Naturalmente, se le variabili sono standardizzate, le saturazioni fattoriali diventano correlazioni:
\[ r_{ij} = \lambda_{ij}. \]
30.1.2.2 Espressione fattoriale della varianza
Come nel modello monofattoriale, la varianza delle variabili manifeste si decompone in una componente dovuta ai fattori comuni, chiamata comunalità, e in una componente specifica alle \(Y_i\), chiamata unicità. Nell’ipotesi che le variabili \(Y_i\) abbiano media nulla, la varianza di \(Y_i\) è uguale a
\[ \begin{aligned} \mathbb{V} (Y_i) &=\mathbb{E}\left[ (\lambda_{i1} \xi_1 + \dots + \lambda_{im} \xi_m + \delta_i)^2 \right]. \end{aligned} \tag{30.1}\]
Come si sviluppa il polinomio precedente? Il quadrato di un polinomio è uguale alla somma dei quadrati di tutti i termini più il doppio prodotto di ogni termine per ciascuno di quelli che lo seguono. Il valore atteso del quadrato del primo termine è uguale a \(\lambda_{i1}^2\mathbb{E}(\xi_1^2)\) ma, essendo la varianza di \(\xi_1\) uguale a \(1\), otteniamo semplicemente \(\lambda_{i1}^2\). Lo stesso vale per i quadrati di tutti i termini seguenti tranne l’ultimo. Infatti, \(\mathbb{E}(\delta_i^2)=\psi_{ii}\). Per quel che riguarda i doppi prodotti, sono tutti nulli. In primo luogo perché, nel caso di fattori ortogonali, la covarianza tra i fattori comuni è nulla, \(\mathbb{E}(\xi_j \xi_h)=0\), con \(j \neq h\). In secondo luogo perché il fattori comuni cono incorrelati con i fattori specifici, quindi \(\mathbb{E}(\delta_i \xi_j)=0\).
In conclusione,
\[ \begin{aligned} \mathbb{V}(Y_i) &= \lambda_{i1}^2 + \lambda_{i2}^2 + \dots + \lambda_{im}^2 + \psi_{ii} \notag\\ &= \sum_{j=1}^m \lambda_{ij}^2 + \psi_{ii}\notag\\ &= h_i^2 + \psi_{ii}\notag\\ &=\text{communalità} + \text{unicità},\notag \end{aligned} \]
la varianza della variabile manifesta \(Y_i\) è suddivisa in due parti: il primo addendo è definito comunalità poiché rappresenta la parte di variabilità della \(Y_i\) spiegata dai fattori comuni; il secondo addendo è invece definito varianza specifica (o unicità) poiché esprime la parte di variabilità della \(Y_i\) non spiegata dai fattori comuni.
30.1.2.3 Espressione fattoriale della covarianza
Quale esempio, consideriamo il caso di \(p=5\) variabili osservabili e \(m=2\) fattori ortogonali. Se le variabili manifeste sono ‘centrate’ (ovvero, se a ciascuna di esse sottraiamo la rispettiva media), allora il modello multifattoriale diventa
\[ \begin{aligned} Y_1 &= \lambda_{11} \xi_1 + \lambda_{12} \xi_2 + \delta_1,\notag\\ Y_2 &= \lambda_{21} \xi_1 + \lambda_{22} \xi_2 + \delta_2,\notag\\ Y_3 &= \lambda_{31} \xi_1 + \lambda_{32} \xi_2 + \delta_3,\notag\\ Y_4 &= \lambda_{41} \xi_1 + \lambda_{42} \xi_2 + \delta_4,\notag\\ Y_5 &= \lambda_{51} \xi_1 + \lambda_{52} \xi_2 + \delta_5.\notag \end{aligned} \]
Nell’ipotesi che le variabili \(Y_i\) abbiano media nulla, la covarianza tra \(Y_1\) e \(Y_2\), ad esempio, è uguale a:
\[ \begin{aligned} Cov(Y_1, Y_2) &= \mathbb{E}\left( Y_1 Y_2\right) \notag\\ &= \mathbb{E}\left[ (\lambda_{11} \xi_1 + \lambda_{12} \xi_2 + \delta_1) (\lambda_{21} \xi_1 + \lambda_{22} \xi_2 + \delta_2) \right]\notag\\ &= \lambda_{11} \lambda_{21} \mathbb{E}(\xi_1^2) + \lambda_{11} \lambda_{22} \mathbb{E}(\xi_1 \xi_2) +\notag \lambda_{11} \mathbb{E}(\xi_1 \delta_2) +\notag\\ &\quad \lambda_{12} \lambda_{21}\mathbb{E}(\xi_1 \xi_2)\, + \lambda_{12} \lambda_{22}\mathbb{E}(\xi^2_2)\, + \lambda_{12} \mathbb{E}(\xi_2\delta_2) +\notag\\ &\quad \lambda_{21} \mathbb{E}(\xi_1\delta_1) +\notag \lambda_{22} \mathbb{E}(\xi_2\delta_1) + \mathbb{E}(\delta_1 \delta_2)\notag\\ &= \lambda_{11} \lambda_{21} + \lambda_{12} \lambda_{22}.\notag \end{aligned} \]
In conclusione, la covarianza tra le variabili manifeste \(Y_l\) e \(Y_m\) riprodotta dal modello è data dalla somma dei prodotti delle saturazioni \(\lambda_l \lambda_m\) nei due fattori.
Esempio. Consideriamo i dati riportati da Brown (2015), ovvero otto misure di personalità raccolte su un campione di 250 pazienti che hanno concluso un programma di psicoterapia. Le scale sono le seguenti:
- anxiety (N1),
- hostility (N2),
- depression (N3),
- self-consciousness (N4),
- warmth (E1),
- gregariousness (E2),
- assertiveness (E3),
- positive emotions (E4).
varnames <- c("N1", "N2", "N3", "N4", "E1", "E2", "E3", "E4")
sds <- '5.7 5.6 6.4 5.7 6.0 6.2 5.7 5.6'
cors <- '
1.000
0.767 1.000
0.731 0.709 1.000
0.778 0.738 0.762 1.000
-0.351 -0.302 -0.356 -0.318 1.000
-0.316 -0.280 -0.300 -0.267 0.675 1.000
-0.296 -0.289 -0.297 -0.296 0.634 0.651 1.000
-0.282 -0.254 -0.292 -0.245 0.534 0.593 0.566 1.000
'
psychot_cor_mat <- getCov(cors, names = varnames)
n <- 250
Eseguiamo l’analisi fattoriale esplorativa con il metodo della massima verosimiglianza ipotizzando due fattori comuni incorrelati:
n_facs <- 2
fit_efa <- factanal(
covmat = psychot_cor_mat,
factors = n_facs,
rotation = "varimax",
n.obs = n
)
Esaminiamo le saturazioni fattoriali:
lambda <- fit_efa$loadings
lambda
#>
#> Loadings:
#> Factor1 Factor2
#> N1 0.854 -0.228
#> N2 0.826 -0.194
#> N3 0.811 -0.233
#> N4 0.865 -0.186
#> E1 -0.202 0.773
#> E2 -0.139 0.829
#> E3 -0.158 0.771
#> E4 -0.147 0.684
#>
#> Factor1 Factor2
#> SS loadings 2.923 2.526
#> Proportion Var 0.365 0.316
#> Cumulative Var 0.365 0.681
La soluzione fattoriale conferma la presenza di due fattori: il primo fattore satura sulle scale di neutoricismo, il secono sulle scale di estroversione.
La correlazione riprodotta \(r_{12}\) è uguale a \(\lambda_{11}\lambda_{21} + \lambda_{12}\lambda_{22}\)
lambda[1, 1] * lambda[2, 1] + lambda[1, 2] * lambda[2, 2]
#> [1] 0.749
e corrisponde da vicino alla correlazione osservata 0.767.
L’intera matrice di correlazioni riprodotte è \(\boldsymbol{\Lambda} \boldsymbol{\Lambda}^{\mathsf{T}} + \boldsymbol{\psi}\):
Rr <- lambda %*% t(lambda) + diag(fit_efa$uniq)
Rr |>
round(3)
#> N1 N2 N3 N4 E1 E2 E3 E4
#> N1 1.000 0.749 0.745 0.781 -0.348 -0.307 -0.311 -0.281
#> N2 0.749 1.000 0.715 0.751 -0.317 -0.276 -0.281 -0.254
#> N3 0.745 0.715 1.000 0.745 -0.344 -0.306 -0.308 -0.279
#> N4 0.781 0.751 0.745 1.000 -0.318 -0.274 -0.280 -0.254
#> E1 -0.348 -0.317 -0.344 -0.318 1.000 0.669 0.628 0.558
#> E2 -0.307 -0.276 -0.306 -0.274 0.669 1.000 0.661 0.587
#> E3 -0.311 -0.281 -0.308 -0.280 0.628 0.661 1.000 0.550
#> E4 -0.281 -0.254 -0.279 -0.254 0.558 0.587 0.550 1.000
La differenza tra la matrice di correlazioni riprodotte e la matrice di correlazioni osservate è uguale a:
(psychot_cor_mat - Rr) |>
round(3)
#> N1 N2 N3 N4 E1 E2 E3 E4
#> N1 0.000 0.018 -0.014 -0.003 -0.003 -0.009 0.015 -0.001
#> N2 0.018 0.000 -0.006 -0.013 0.015 -0.004 -0.008 0.000
#> N3 -0.014 -0.006 0.000 0.017 -0.012 0.006 0.011 -0.013
#> N4 -0.003 -0.013 0.017 0.000 0.000 0.007 -0.016 0.009
#> E1 -0.003 0.015 -0.012 0.000 0.000 0.006 0.006 -0.024
#> E2 -0.009 -0.004 0.006 0.007 0.006 0.000 -0.010 0.006
#> E3 0.015 -0.008 0.011 -0.016 0.006 -0.010 0.000 0.016
#> E4 -0.001 0.000 -0.013 0.009 -0.024 0.006 0.016 0.000
30.2 Fattori obliqui
Anche nel caso di fattori comuni correlati è possibile esprimere nei termini dei parametri del modello la covarianza teorica tra una variabile manifesta \(Y_i\) e uno dei fattori comuni, la covarianza teorica tra due variabili manifeste, e la comunalità di ciascuna variabile manifesta. Dato però che i fattori comuni risultano correlati, l’espressione fattoriale di tali quantità è più complessa che nel caso di fattori comuni ortogonali.
30.2.1 Covarianza teorica tra variabili e fattori
In base al modello multifattoriale con \(m\) fattori comuni la variabile \(Y_i\) è
\[ Y_i = \lambda_{i1} \xi_1 + \dots + \lambda_{im} \xi_m + \delta_i. (\#eq:mod-multifact) \]
Poniamoci il problema di trovare la covarianza teorica tra la variabile manifesta \(Y_i\) e il fattore comune \(\xi_j\). Come in precedenza, il problema si riduce a quello di trovare \(\mathbb{E}(Y_i \xi_j)\). Ne segue che
\[ \begin{equation} \begin{aligned} Cov(Y_i, \xi_j) &= \mathbb{E}(Y_i \xi_j)\notag\\ &=\mathbb{E}\left[(\lambda_{i1} \xi_1 + \dots + \lambda_{ij} \xi_j + \dots + \lambda_{im} \xi_m + \delta_i)\xi_j \right]\notag\\ &= \lambda_{i1}\underbrace{\mathbb{E}(\xi_1\xi_j)}_{\neq 0} + \dots + \lambda_{ij}\underbrace{\mathbb{E}(\xi_j^2)}_{=1} + \dots \notag\\ & \quad + \lambda_{im}\underbrace{\mathbb{E}(\xi_m\xi_j)}_{\neq 0} + \underbrace{\mathbb{E}(\delta_i \xi_j)}_{=0}\notag\\ &= \lambda_{ij} + \lambda_{i1} Cov(\xi_1, \xi_j) + \dots + \lambda_{im} Cov(\xi_m, \xi_j). \end{aligned} \end{equation} \]
Ad esempio, nel caso di tre fattori comuni \(\xi_1, \xi_2, \xi_3\), la covarianza tra \(Y_1\) e \(\xi_{1}\) diventa
\[ \lambda_{11} + \lambda_{12}Cov(\xi_1, \xi_2) + \lambda_{13}Cov(\xi_1, \xi_3). \]
30.2.2 Espressione fattoriale della varianza
Poniamoci ora il problema di trovare la varianza teorica della variabile manifesta \(Y_i\). In base al modello fattoriale, la variabile \(Y_i\) è specificata come nella @ref(eq:mod-multifact). La varianza di \(Y_i\) è \(\mathbb{V}(Y_i) = \mathbb{E}(Y_i^2) -[\mathbb{E}(Y_i)]^2\). Però, avendo espresso \(Y_i\) nei termini della differenza dalla sua media, l’espressione della varianza si riduce a \(\mathbb{V}(Y_i) = \mathbb{E}(Y_i^2)\). Dobbiamo dunque sviluppare l’espressione
\[ \mathbb{E}(Y_i^2) = \mathbb{E}[(\lambda_{i1} \xi_1 + \dots + \lambda_{im} \xi_m + \delta_i)^2]. \]
In conclusione, la varianza teorica di \(Y_i\) è uguale a
\[ \begin{equation} \begin{split} \mathbb{V}(Y_i) &= \lambda_{i1}^2 + \lambda_{i2}^2 + \dots + \lambda_{im}^2 + \\ &\quad 2 \lambda_{i1} \lambda_{i2} Cov(\xi_1, \xi_2) + \dots + 2 \lambda_{i,m-1} \lambda_{im} Cov(\xi_{m-1}, \xi_m) + \\ &\quad \psi_{ii}.\notag \end{split} \end{equation} \]
Ad esempio, nel caso di tre fattori comuni, \(\xi_1, \xi_2, \xi_3\), la varianza di \(Y_1\) è
\[ \begin{equation} \begin{split} \mathbb{V}(Y_1) = &\lambda_{11}^2 + \lambda_{12}^2 + \lambda_{13}^2 +\\ &\quad 2 \lambda_{11} \lambda_{12} Cov(\xi_1, \xi_2) + \\ &\quad 2 \lambda_{11} \lambda_{13} Cov(\xi_1, \xi_3) + \\ &\quad 2 \lambda_{12} \lambda_{13} Cov(\xi_2, \xi_3) + \\ &\quad \psi_{11}. \notag \end{split} \end{equation} \]
30.2.3 Covarianza teorica tra due variabili
Consideriamo ora il caso più semplice di due soli fattori comuni correlati e calcoliamo la covarianza tra \(Y_1\) e \(Y_2\):
\[ \begin{equation} \begin{aligned} \mathbb{E}(Y_1 Y_2) =\mathbb{E}[(&\lambda_{11}\xi_1 + \lambda_{12}\xi_2+\delta_1) (\lambda_{21}\xi_1 + \lambda_{22}\xi_2+\delta_2)]\notag\\ =\mathbb{E}( &\lambda_{11}\lambda_{21}\xi_1^2 + \lambda_{11}\lambda_{22}\xi_1\xi_2 + \lambda_{11}\xi_1\delta_2 +\notag\\ +&\lambda_{12}\lambda_{21}\xi_1\xi_2 + \lambda_{12}\lambda_{22}\xi_2^2 + \lambda_{12}\xi_2\delta_2 +\notag\\ +&\lambda_{21}\xi_1\delta_1 + \lambda_{22}\xi_2\delta_1 + \delta_1\delta_2).\notag \end{aligned} \end{equation} \]
Distribuendo l’operatore di valore atteso, dato che \(\mathbb{E}(\xi^2)=1\) e \(\mathbb{E}(\xi \delta)=0\), otteniamo
\[ Cov(Y_1, Y_2) = \lambda_{11} \lambda_{21} + \lambda_{12} \lambda_{22} + \lambda_{12} \lambda_{21}Cov(\xi_1, \xi_2) +\lambda_{11} \lambda_{22}Cov(\xi_1, \xi_2). \]
In termini matriciali si scrive
\[ \boldsymbol{\Sigma} =\boldsymbol{\Lambda} \boldsymbol{\Phi} \boldsymbol{\Lambda}^{\mathsf{T}} + \boldsymbol{\Psi}, \]
dove \(\boldsymbol{\Phi}\) è la matrice di ordine \(m \times m\) di varianze e covarianze tra i fattori comuni e \(\boldsymbol{\Psi}\) è una matrice diagonale di ordine \(p\) con le unicità delle variabili.
Esempio. Consideriamo nuovamente i dati esaminati negli esercizi precedenti, ma questa volta il modello consente una correlazione tra i due fattori comuni:
efa_result <- fa(
psychot_cor_mat,
nfactors = 2,
n.obs = n,
rotate = "oblimin"
)
efa_result
#> Factor Analysis using method = minres
#> Call: fa(r = psychot_cor_mat, nfactors = 2, n.obs = n, rotate = "oblimin")
#> Standardized loadings (pattern matrix) based upon correlation matrix
#> MR1 MR2 h2 u2 com
#> N1 0.88 -0.02 0.78 0.22 1
#> N2 0.85 0.01 0.72 0.28 1
#> N3 0.83 -0.04 0.71 0.29 1
#> N4 0.90 0.03 0.78 0.22 1
#> E1 -0.05 0.77 0.63 0.37 1
#> E2 0.03 0.86 0.71 0.29 1
#> E3 0.00 0.79 0.63 0.37 1
#> E4 -0.01 0.70 0.49 0.51 1
#>
#> MR1 MR2
#> SS loadings 3.00 2.45
#> Proportion Var 0.37 0.31
#> Cumulative Var 0.37 0.68
#> Proportion Explained 0.55 0.45
#> Cumulative Proportion 0.55 1.00
#>
#> With factor correlations of
#> MR1 MR2
#> MR1 1.00 -0.43
#> MR2 -0.43 1.00
#>
#> Mean item complexity = 1
#> Test of the hypothesis that 2 factors are sufficient.
#>
#> df null model = 28 with the objective function = 5.02 with Chi Square = 1231
#> df of the model are 13 and the objective function was 0.04
#>
#> The root mean square of the residuals (RMSR) is 0.01
#> The df corrected root mean square of the residuals is 0.02
#>
#> The harmonic n.obs is 250 with the empirical chi square 1.73 with prob < 1
#> The total n.obs was 250 with Likelihood Chi Square = 9.65 with prob < 0.72
#>
#> Tucker Lewis Index of factoring reliability = 1.01
#> RMSEA index = 0 and the 90 % confidence intervals are 0 0.047
#> BIC = -62.1
#> Fit based upon off diagonal values = 1
#> Measures of factor score adequacy
#> MR1 MR2
#> Correlation of (regression) scores with factors 0.96 0.94
#> Multiple R square of scores with factors 0.93 0.87
#> Minimum correlation of possible factor scores 0.85 0.75
fa.diagram(efa_result)
Esaminiamo la matrice delle correlazioni residue:
residuals <- residuals(efa_result)
residuals
#> N1 N2 N3 N4 E1 E2 E3 E4
#> N1 0.22
#> N2 0.02 0.28
#> N3 -0.01 0.00 0.29
#> N4 0.00 -0.01 0.02 0.22
#> E1 0.00 0.01 -0.01 0.00 0.37
#> E2 -0.01 0.00 0.01 0.01 0.01 0.29
#> E3 0.01 -0.01 0.01 -0.02 0.01 -0.01 0.37
#> E4 0.00 0.00 -0.01 0.01 -0.02 0.01 0.01 0.51
Esaminiamo più da vicino la matrice di correlazioni riprodotta dal modello, nel caso di fattori obliqui. Le saturazioni fattoriali sono:
# Estrai i carichi fattoriali (saturazioni fattoriali)
lambda <- efa_result$loadings
# Converti i carichi in una matrice 8 x 2 (assumendo 2 fattori)
# e assegna i nomi appropriati alle righe e alle colonne
lambda <- matrix(lambda[, 1:2], nrow = 8, ncol = 2)
rownames(lambda) <- c("N1", "N2", "N3", "N4", "E1", "E2", "E3", "E4")
colnames(lambda) <- c("Factor1", "Factor2")
# Stampa la matrice dei carichi
lambda
#> Factor1 Factor2
#> N1 0.87708 -0.0158
#> N2 0.85228 0.0113
#> N3 0.82658 -0.0368
#> N4 0.89876 0.0312
#> E1 -0.04859 0.7719
#> E2 0.03470 0.8557
#> E3 0.00282 0.7929
#> E4 -0.00788 0.6955
La matrice di intercorrelazoni fattoriali è
# Estrai la matrice delle intercorrelazioni fattoriali
Phi <- efa_result$Phi
# Stampa la matrice delle intercorrelazioni
Phi
#> MR1 MR2
#> MR1 1.000 -0.431
#> MR2 -0.431 1.000
Le varianze residue sono:
# Estrai le varianze residue
Psi <- diag(efa_result$uniquenesses)
Psi |>
round(2)
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#> [1,] 0.22 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#> [2,] 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00
#> [3,] 0.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00
#> [4,] 0.00 0.00 0.00 0.22 0.00 0.00 0.00 0.00
#> [5,] 0.00 0.00 0.00 0.00 0.37 0.00 0.00 0.00
#> [6,] 0.00 0.00 0.00 0.00 0.00 0.29 0.00 0.00
#> [7,] 0.00 0.00 0.00 0.00 0.00 0.00 0.37 0.00
#> [8,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.51
Mediante i parametri del modello la matrice di correlazione si riproduce nel modo seguente:
\[ \boldsymbol{\Sigma} =\boldsymbol{\Lambda} \boldsymbol{\Phi} \boldsymbol{\Lambda}^{\mathsf{T}} + \boldsymbol{\Psi}. \]
In \(\textsf{R}\) scriviamo:
R_hat <- lambda %*% Phi %*% t(lambda) + Psi
R_hat |>
round(2)
#> N1 N2 N3 N4 E1 E2 E3 E4
#> N1 1.00 0.75 0.75 0.78 -0.35 -0.31 -0.31 -0.28
#> N2 0.75 1.00 0.71 0.75 -0.32 -0.28 -0.28 -0.25
#> N3 0.75 0.71 1.00 0.74 -0.34 -0.31 -0.31 -0.28
#> N4 0.78 0.75 0.74 1.00 -0.32 -0.27 -0.28 -0.25
#> E1 -0.35 -0.32 -0.34 -0.32 1.00 0.67 0.63 0.55
#> E2 -0.31 -0.28 -0.31 -0.27 0.67 1.00 0.67 0.59
#> E3 -0.31 -0.28 -0.31 -0.28 0.63 0.67 1.00 0.55
#> E4 -0.28 -0.25 -0.28 -0.25 0.55 0.59 0.55 1.00
Le correlazioni residue sono:
psychot_cor_mat - R_hat |>
round(2)
#> N1 N2 N3 N4 E1 E2 E3 E4
#> N1 0.000 0.017 -0.019 -0.002 -0.001 -0.006 0.014 -0.002
#> N2 0.017 0.000 -0.001 -0.012 0.018 0.000 -0.009 -0.004
#> N3 -0.019 -0.001 0.000 0.022 -0.016 0.010 0.013 -0.012
#> N4 -0.002 -0.012 0.022 0.000 0.002 0.003 -0.016 0.005
#> E1 -0.001 0.018 -0.016 0.002 0.000 0.005 0.004 -0.016
#> E2 -0.006 0.000 0.010 0.003 0.005 0.000 -0.019 0.003
#> E3 0.014 -0.009 0.013 -0.016 0.004 -0.019 0.000 0.016
#> E4 -0.002 -0.004 -0.012 0.005 -0.016 0.003 0.016 0.000
Per fare un esempio relativo alla correlazione tra due indicatori, calcoliamo la correlazione predetta dal modello tra le variabili \(Y_1\) e \(Y_2\):
lambda[1, 1] * lambda[2, 1] + lambda[1, 2] * lambda[2, 2] +
lambda[1, 1] * lambda[2, 2] * Phi[1, 2] +
lambda[1, 2] * lambda[2, 1] * Phi[1, 2]
#> [1] 0.749
Questo valore si avvicina al valore contenuto dell’elemento (1, 2) della matrice di correlazioni osservate:
psychot_cor_mat[1, 2]
#> [1] 0.767
Usando questa procedura possiamo riprodurre tutti gli elementi della matrice di correlazione osservata tramite i parametri stimati dal modello EFA replicando così il risultato che si trova con \(\boldsymbol{\Sigma} =\boldsymbol{\Lambda} \boldsymbol{\Phi} \boldsymbol{\Lambda}^{\mathsf{T}} + \boldsymbol{\Psi}\).
30.3 Session Info
sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.3.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/UTF-8/C/C/C/C
#>
#> time zone: Europe/Rome
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] kableExtra_1.4.0 tidySEM_0.2.7 OpenMx_2.21.13 corrplot_0.95
#> [5] ggokabeito_0.1.0 see_0.10.0 MASS_7.3-65 viridis_0.6.5
#> [9] viridisLite_0.4.2 ggpubr_0.6.0 ggExtra_0.10.1 gridExtra_2.3
#> [13] patchwork_1.3.0 bayesplot_1.11.1 semTools_0.5-6 semPlot_1.1.6
#> [17] lavaan_0.6-19 psych_2.4.12 scales_1.3.0 markdown_1.13
#> [21] knitr_1.49 lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1
#> [25] dplyr_1.1.4 purrr_1.0.4 readr_2.1.5 tidyr_1.3.1
#> [29] tibble_3.2.1 ggplot2_3.5.1 tidyverse_2.0.0 here_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] splines_4.4.2 later_1.4.1 XML_3.99-0.18
#> [4] rpart_4.1.24 fastDummies_1.7.5 lifecycle_1.0.4
#> [7] Rdpack_2.6.2 rstatix_0.7.2 rprojroot_2.0.4
#> [10] StanHeaders_2.32.10 globals_0.16.3 lattice_0.22-6
#> [13] rockchalk_1.8.157 backports_1.5.0 magrittr_2.0.3
#> [16] openxlsx_4.2.8 Hmisc_5.2-2 rmarkdown_2.29
#> [19] httpuv_1.6.15 tmvnsim_1.0-2 qgraph_1.9.8
#> [22] zip_2.3.2 pkgbuild_1.4.6 pbapply_1.7-2
#> [25] minqa_1.2.8 multcomp_1.4-28 abind_1.4-8
#> [28] quadprog_1.5-8 nnet_7.3-20 TH.data_1.1-3
#> [31] sandwich_3.1-1 inline_0.3.21 listenv_0.9.1
#> [34] arm_1.14-4 proto_1.0.0 parallelly_1.42.0
#> [37] texreg_1.39.4 svglite_2.1.3 codetools_0.2-20
#> [40] xml2_1.3.7 tidyselect_1.2.1 farver_2.1.2
#> [43] lme4_1.1-36 matrixStats_1.5.0 stats4_4.4.2
#> [46] base64enc_0.1-3 jsonlite_1.9.0 progressr_0.15.1
#> [49] Formula_1.2-5 survival_3.8-3 emmeans_1.10.7
#> [52] systemfonts_1.2.1 dbscan_1.2.2 tools_4.4.2
#> [55] Rcpp_1.0.14 glue_1.8.0 mnormt_2.1.1
#> [58] xfun_0.51 MplusAutomation_1.1.1 loo_2.8.0
#> [61] withr_3.0.2 fastmap_1.2.0 boot_1.3-31
#> [64] digest_0.6.37 mi_1.1 timechange_0.3.0
#> [67] R6_2.6.1 mime_0.12 estimability_1.5.1
#> [70] colorspace_2.1-1 gtools_3.9.5 jpeg_0.1-10
#> [73] generics_0.1.3 data.table_1.17.0 corpcor_1.6.10
#> [76] httr_1.4.7 htmlwidgets_1.6.4 pkgconfig_2.0.3
#> [79] sem_3.1-16 gtable_0.3.6 bain_0.2.11
#> [82] htmltools_0.5.8.1 carData_3.0-5 blavaan_0.5-8
#> [85] png_0.1-8 reformulas_0.4.0 rstudioapi_0.17.1
#> [88] tzdb_0.4.0 reshape2_1.4.4 curl_6.2.1
#> [91] coda_0.19-4.1 checkmate_2.3.2 nlme_3.1-167
#> [94] nloptr_2.1.1 zoo_1.8-13 parallel_4.4.2
#> [97] miniUI_0.1.1.1 nonnest2_0.5-8 foreign_0.8-88
#> [100] pillar_1.10.1 grid_4.4.2 vctrs_0.6.5
#> [103] RANN_2.6.2 promises_1.3.2 car_3.1-3
#> [106] xtable_1.8-4 cluster_2.1.8 GPArotation_2024.3-1
#> [109] htmlTable_2.4.3 evaluate_1.0.3 pbivnorm_0.6.0
#> [112] gsubfn_0.7 mvtnorm_1.3-3 cli_3.6.4
#> [115] kutils_1.73 compiler_4.4.2 rlang_1.1.5
#> [118] rstantools_2.4.0 future.apply_1.11.3 ggsignif_0.6.4
#> [121] fdrtool_1.2.18 plyr_1.8.9 stringi_1.8.4
#> [124] rstan_2.32.6 pander_0.6.6 QuickJSR_1.6.0
#> [127] munsell_0.5.1 lisrelToR_0.3 CompQuadForm_1.4.3
#> [130] V8_6.0.1 pacman_0.5.1 Matrix_1.7-2
#> [133] hms_1.1.3 glasso_1.11 future_1.34.0
#> [136] shiny_1.10.0 rbibutils_2.3 igraph_2.1.4
#> [139] broom_1.0.7 RcppParallel_5.1.10