here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(lavaan, corrr, psych)
34 Valutazione della matrice di correlazione
- esaminare la matrice di correlazione tra le variabili come passo preliminare di un’analisi fattoriale.
- Leggere il capitolo Factor Analysis and Principal Component Analysis del testo di Petersen (2024).
34.1 Introduzione
Prima di intraprendere un’analisi fattoriale, è essenziale esaminare la matrice di correlazione tra le variabili. Un determinante nullo della matrice di correlazione indica che l’analisi fattoriale non può essere eseguita a causa di collinearità perfetta tra le variabili. Se il determinante è diverso da zero, è comunque necessario valutare se le correlazioni tra le variabili sono sufficientemente elevate da giustificare un’analisi fattoriale. Correlazioni deboli tra gli item possono portare a soluzioni non parsimoniose. Questo può essere valutato sia tramite ispezione visiva della matrice di correlazione sia attraverso due test statistici: il test di sfericità di Bartlett e l’indice Kaiser-Meyer-Olkin (KMO).
34.2 Analisi Preliminari
Per illustrare il procedimento di analisi preliminare dei dati, utilizziamo il dataset HolzingerSwineford1939
, che contiene 301 osservazioni relative a punteggi di abilità mentale. In questa analisi consideriamo le variabili x1
–x9
.
Cominciamo con un’anteprima del dataset e una verifica della presenza di dati mancanti.
# Caricamento del dataset e visualizzazione iniziale
data(HolzingerSwineford1939)
glimpse(HolzingerSwineford1939)
#> Rows: 301
#> Columns: 15
#> $ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, …
#> $ sex <int> 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2,…
#> $ ageyr <int> 13, 13, 13, 13, 12, 14, 12, 12, 13, 12, 12, 12, 12, 12, 12,…
#> $ agemo <int> 1, 7, 1, 2, 2, 1, 1, 2, 0, 5, 2, 11, 7, 8, 6, 1, 11, 5, 8, …
#> $ school <fct> Pasteur, Pasteur, Pasteur, Pasteur, Pasteur, Pasteur, Paste…
#> $ grade <int> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,…
#> $ x1 <dbl> 3.33, 5.33, 4.50, 5.33, 4.83, 5.33, 2.83, 5.67, 4.50, 3.50,…
#> $ x2 <dbl> 7.75, 5.25, 5.25, 7.75, 4.75, 5.00, 6.00, 6.25, 5.75, 5.25,…
#> $ x3 <dbl> 0.375, 2.125, 1.875, 3.000, 0.875, 2.250, 1.000, 1.875, 1.5…
#> $ x4 <dbl> 2.33, 1.67, 1.00, 2.67, 2.67, 1.00, 3.33, 3.67, 2.67, 2.67,…
#> $ x5 <dbl> 5.75, 3.00, 1.75, 4.50, 4.00, 3.00, 6.00, 4.25, 5.75, 5.00,…
#> $ x6 <dbl> 1.286, 1.286, 0.429, 2.429, 2.571, 0.857, 2.857, 1.286, 2.7…
#> $ x7 <dbl> 3.39, 3.78, 3.26, 3.00, 3.70, 4.35, 4.70, 3.39, 4.52, 4.13,…
#> $ x8 <dbl> 5.75, 6.25, 3.90, 5.30, 6.30, 6.65, 6.20, 5.15, 4.65, 4.55,…
#> $ x9 <dbl> 6.36, 7.92, 4.42, 4.86, 5.92, 7.50, 4.86, 3.67, 7.36, 4.36,…
# Selezione delle variabili di interesse
hz <- HolzingerSwineford1939 |>
dplyr::select(x1:x9)
# Visualizzazione delle prime 5 righe
hz |>
slice(1:5)
#> x1 x2 x3 x4 x5 x6 x7 x8 x9
#> 1 3.33 7.75 0.375 2.33 5.75 1.286 3.39 5.75 6.36
#> 2 5.33 5.25 2.125 1.67 3.00 1.286 3.78 6.25 7.92
#> 3 4.50 5.25 1.875 1.00 1.75 0.429 3.26 3.90 4.42
#> 4 5.33 7.75 3.000 2.67 4.50 2.429 3.00 5.30 4.86
#> 5 4.83 4.75 0.875 2.67 4.00 2.571 3.70 6.30 5.92
34.2.1 Valutazione dei Dati Mancanti
Prima di procedere all’ispezione visiva, è importante verificare la presenza di dati mancanti. Eventuali valori mancanti potrebbero influenzare le correlazioni calcolate e, di conseguenza, l’esito dell’analisi fattoriale.
In questo set di dati non ci sono dati mancanti.
Se dati mancanti sono presenti, sarà necessario applicare un’adeguata tecnica di gestione, come imputazione o rimozione dei casi con dati mancanti, prima di proseguire con l’analisi.
Questa fase preliminare è fondamentale per garantire la validità e l’affidabilità delle conclusioni tratte dall’analisi fattoriale.
34.2.2 Distribuzione delle variabili
Esaminiamo la distribuzione delle variabili.
describe(hz)
#> vars n mean sd median trimmed mad min max range skew kurtosis
#> x1 1 301 4.94 1.17 5.00 4.96 1.24 0.67 8.50 7.83 -0.25 0.31
#> x2 2 301 6.09 1.18 6.00 6.02 1.11 2.25 9.25 7.00 0.47 0.33
#> x3 3 301 2.25 1.13 2.12 2.20 1.30 0.25 4.50 4.25 0.38 -0.91
#> x4 4 301 3.06 1.16 3.00 3.02 0.99 0.00 6.33 6.33 0.27 0.08
#> x5 5 301 4.34 1.29 4.50 4.40 1.48 1.00 7.00 6.00 -0.35 -0.55
#> x6 6 301 2.19 1.10 2.00 2.09 1.06 0.14 6.14 6.00 0.86 0.82
#> x7 7 301 4.19 1.09 4.09 4.16 1.10 1.30 7.43 6.13 0.25 -0.31
#> x8 8 301 5.53 1.01 5.50 5.49 0.96 3.05 10.00 6.95 0.53 1.17
#> x9 9 301 5.37 1.01 5.42 5.37 0.99 2.78 9.25 6.47 0.20 0.29
#> se
#> x1 0.07
#> x2 0.07
#> x3 0.07
#> x4 0.07
#> x5 0.07
#> x6 0.06
#> x7 0.06
#> x8 0.06
#> x9 0.06
I valori di asimmetria e kurosi sono adeguati.
34.2.3 Correlazioni
Un’ispezione visiva della matrice di correlazione consente di identificare blocchi di variabili con alte correlazioni interne e basse correlazioni con altre variabili. La presenza di tali blocchi suggerisce la possibilità di più fattori comuni sottostanti.
Esaminiamo le correlazioni tra le variabili usando le funzioni del pacchetto corrr
:
-
corrr::rearrange
raggruppa le variabili altamente correlate -
corrr::rplot
visualizza il risultato.
cor_tb <- correlate(hz)
cor_tb |>
rearrange() |>
rplot(colors = c("red", "white", "blue"))
Il grafico suggerisce la presenza di tre gruppi di variabili:
- da x4 a x6 (primo gruppo)
- da x1 a x3 (secondo gruppo)
- da x7 a x9 (terzo gruppo).
34.3 Sfericità di Bartlett
Il test di sfericità di Bartlett verifica l’ipotesi che il campione provenga da una popolazione in cui le variabili non sono correlate. Formalmente, il test della sfericità di Bartlett verifica l’ipotesi \(H_0 : \boldsymbol{R} = \boldsymbol{I}\) tramite la formula:
\[ \chi^2 = -\bigg[n -1 -\frac{1}{6} (2p +5)\bigg] \ln |\boldsymbol{R}|, \]
in cui \(n\) è il numero dei soggetti, \(p\) il numero delle variabili e \(|\boldsymbol{R}|\) il determinante della matrice di correlazione.
La statistica del test di sfericità di Bartlett segue una distribuzione chi-quadro con \(p(p - 1)/2\) gradi di libertà. Un valore elevato della statistica indica che la matrice di correlazione R contiene valori di correlazione significativamente diversi da 0. Al contrario, un valore basso della statistica indica che le correlazioni sono basse e non si distinguono da 0.
Il limite di questo test è che dipende dal numero delle variabili e dalla numerosità del campione, quindi tende a rigettare \(H_0\) all’aumentare del campione e del numero delle variabili, anche se le correlazioni sono piccole.
Applichiamo il test di Bartlet per il dati dell’esempio in discussione.
Il risultato del test di Bartlett sui dati HolzingerSwineford1939
indica che esiste una correlazione tra le variabili.
34.4 Test di adeguatezza campionaria di Kaiser-Meyer-Olkin
Il test di Kaiser-Meyer-Olkin (KMO) è uno strumento statistico che valuta l’adeguatezza dei dati per l’analisi fattoriale. Esso misura la proporzione di varianza tra le variabili che potrebbe essere attribuita a fattori comuni. Un valore KMO più alto indica una maggiore adattabilità dei dati all’analisi fattoriale.
La statistica di adeguatezza campionaria KMO è data da
\[\text{KMO} = \frac{\sum_i\sum_j r^2_{ij}}{\sum_i\sum_j r^2_{ij} +\sum_i\sum_jp^2_{ij}},\]
dove \(r_{ij}\) sono le correlazioni osservate e \(p_{ij}\) sono le correlazioni parzializzate su tutte le altre. Se le correlazioni parzializzate sono piccole, KMO tende a 1.
Secondo Kaiser (1970), l’adeguatezza campionaria si valuta nel modo seguente:
- da 0.00 a 0.49: inaccettabile
- da 0.50 a 0.59: miserabile
- da 0.60 a 0.69: mediocre
- da 0.70 a 0.79: media
- da 0.80 a 0.89: meritevole
- da 0.90 a 1.00: meravigliosa.
Applichiamo il test KMO ai dati HolzingerSwineford1939
.
out = KMO(cor_mat)
print(out)
#> Kaiser-Meyer-Olkin factor adequacy
#> Call: KMO(r = cor_mat)
#> Overall MSA = 0.75
#> MSA for each item =
#> x1 x2 x3 x4 x5 x6 x7 x8 x9
#> 0.81 0.78 0.73 0.76 0.74 0.81 0.59 0.68 0.79
Per questi dati, il risultato del test KMO indica che l’adeguatezza campionaria è media.
34.5 Riflessioni Conclusive
L’analisi preliminare dei dati rappresenta un passaggio essenziale per verificare l’adeguatezza di un dataset all’analisi fattoriale. L’ispezione visiva della matrice di correlazione, il test di sfericità di Bartlett e il test di adeguatezza campionaria KMO forniscono indicazioni complementari sull’esistenza di relazioni tra le variabili e sulla qualità dei dati rispetto alla struttura fattoriale. Nel caso del dataset HolzingerSwineford1939
, i risultati suggeriscono che le correlazioni tra le variabili giustificano l’analisi fattoriale, mentre il valore medio del KMO evidenzia un margine di miglioramento nella struttura dei dati, come la revisione delle variabili incluse o l’aumento della numerosità campionaria. Questi strumenti aiutano a garantire che l’analisi fattoriale sia basata su una base dati solida, facilitando interpretazioni affidabili dei fattori estratti.
34.6 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] corrr_0.4.4 ggokabeito_0.1.0 see_0.10.0 MASS_7.3-65
#> [5] viridis_0.6.5 viridisLite_0.4.2 ggpubr_0.6.0 ggExtra_0.10.1
#> [9] gridExtra_2.3 patchwork_1.3.0 bayesplot_1.11.1 semTools_0.5-6
#> [13] semPlot_1.1.6 lavaan_0.6-19 psych_2.4.12 scales_1.3.0
#> [17] markdown_1.13 knitr_1.49 lubridate_1.9.4 forcats_1.0.0
#> [21] stringr_1.5.1 dplyr_1.1.4 purrr_1.0.4 readr_2.1.5
#> [25] tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.1 tidyverse_2.0.0
#> [29] here_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] rstudioapi_0.17.1 jsonlite_1.9.0 magrittr_2.0.3
#> [4] TH.data_1.1-3 estimability_1.5.1 farver_2.1.2
#> [7] nloptr_2.1.1 rmarkdown_2.29 vctrs_0.6.5
#> [10] minqa_1.2.8 base64enc_0.1-3 rstatix_0.7.2
#> [13] htmltools_0.5.8.1 broom_1.0.7 Formula_1.2-5
#> [16] htmlwidgets_1.6.4 plyr_1.8.9 sandwich_3.1-1
#> [19] emmeans_1.10.7 zoo_1.8-13 igraph_2.1.4
#> [22] iterators_1.0.14 mime_0.12 lifecycle_1.0.4
#> [25] pkgconfig_2.0.3 Matrix_1.7-2 R6_2.6.1
#> [28] fastmap_1.2.0 rbibutils_2.3 shiny_1.10.0
#> [31] digest_0.6.37 OpenMx_2.21.13 fdrtool_1.2.18
#> [34] colorspace_2.1-1 rprojroot_2.0.4 Hmisc_5.2-2
#> [37] seriation_1.5.7 labeling_0.4.3 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-88 zip_2.3.2 httpuv_1.6.15
#> [55] nnet_7.3-20 glue_1.8.0 quadprog_1.5-8
#> [58] nlme_3.1-167 promises_1.3.2 lisrelToR_0.3
#> [61] grid_4.4.2 checkmate_2.3.2 cluster_2.1.8
#> [64] reshape2_1.4.4 generics_0.1.3 gtable_0.3.6
#> [67] tzdb_0.4.0 ca_0.71.1 data.table_1.17.0
#> [70] hms_1.1.3 car_3.1-3 sem_3.1-16
#> [73] foreach_1.5.2 pillar_1.10.1 rockchalk_1.8.157
#> [76] later_1.4.1 splines_4.4.2 lattice_0.22-6
#> [79] survival_3.8-3 kutils_1.73 tidyselect_1.2.1
#> [82] registry_0.5-1 miniUI_0.1.1.1 pbapply_1.7-2
#> [85] reformulas_0.4.0 stats4_4.4.2 xfun_0.51
#> [88] qgraph_1.9.8 arm_1.14-4 stringi_1.8.4
#> [91] yaml_2.3.10 pacman_0.5.1 boot_1.3-31
#> [94] evaluate_1.0.3 codetools_0.2-20 mi_1.1
#> [97] cli_3.6.4 RcppParallel_5.1.10 rpart_4.1.24
#> [100] xtable_1.8-4 Rdpack_2.6.2 munsell_0.5.1
#> [103] Rcpp_1.0.14 coda_0.19-4.1 png_0.1-8
#> [106] XML_3.99-0.18 parallel_4.4.2 jpeg_0.1-10
#> [109] lme4_1.1-36 mvtnorm_1.3-3 openxlsx_4.2.8
#> [112] rlang_1.1.5 TSP_1.2-4 multcomp_1.4-28
#> [115] mnormt_2.1.1