42  CFA per matrici multi-tratto multi-metodo

Prerequisiti

Concetti e Competenze Chiave

Preparazione del Notebook

here::here("code", "_common.R") |>
    source()

# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(lavaan, psych, semPlot)

42.1 Introduzione

La validità descrive quanto accuratamente un metodo di misurazione riesce a quantificare ciò che è inteso misurare. Esistono diverse categorie di validità, ognuna delle quali si verifica attraverso metodi specifici. Una suddivisione convenzionale delle diverse tipologie di validità, che non riflette necessariamente gli sviluppi più recenti in questo campo, può essere descritta come segue (per ulteriori dettagli si rimanda al capitolo dedicato alla validità nella presente dispena):

  • Validità di facciata: Valuta se gli item di un test appaiono appropriati e ragionevoli rispetto al costrutto che si intende misurare, sia agli occhi di chi partecipa al test sia di chi lo utilizza. Questo tipo di validità è basato sulla percezione esteriore della misura e si valuta tramite i giudizi di esperti sulla plausibilità delle misure.

  • Validità di contenuto: Una misura possiede validità di contenuto quando i suoi indicatori rappresentano in modo esaustivo e accurato l’area di contenuto da misurare. Anche questa validità si basa sui giudizi di esperti.

  • Validità di costrutto: Corrisponde alla definizione generale di validità e si riferisce alla capacità di uno strumento di misurare il costrutto che intende misurare. La validità di costrutto si verifica attraverso la correttezza con cui gli indicatori misurano i costrutti teorici di interesse e si convalida attraverso l’analisi delle relazioni tra il costrutto misurato e altri costrutti correlati, secondo modelli teorici specifici.

  • Validità di criterio: Indica la capacità di uno strumento di fare previsioni accurate su un criterio esterno, valutando quanto bene la misura predice questo criterio.

  • Validità concorrente: Si determina osservando quanto uno strumento di misurazione correla con altri strumenti considerati validi per misurare lo stesso attributo. Una forte correlazione è generalmente vista come una conferma della validità.

  • Validità convergente: Si verifica confrontando e correlando i punteggi ottenuti con la misura da validare con quelli ottenuti da un altro costrutto teoricamente relazionato. La verifica di questa validità dipende dall’esistenza di misure valide per costrutti correlati.

  • Validità discriminante: È l’opposto della validità convergente e si verifica quando la misura in esame non mostra correlazioni significative con le misure di costrutti teoricamente distinti.

42.1.1 MTMM e CFA

La Matrice Multi-Tratto Multi-Metodo (MTMM) è un approccio utilizzato per valutare la validità di costrutto, esaminando la correlazione tra diversi costrutti misurati sia con gli stessi metodi sia con metodi differenti. La validità di costrutto è considerata alta quando la misura di un costrutto è indipendente dal metodo di misurazione utilizzato.

42.1.2 Un esempio concreto

Nell’esempio discusso da {cite:t}brown2015confirmatory, il ricercatore desidera esaminare la validità del costrutto dei disturbi di personalità del Cluster A del DSM-IV, che sono pattern persistenti di sintomi caratterizzati da comportamenti strani o eccentrici (American Psychiatric Association, 1994). Il cluster A comprende tre costrutti di disturbo della personalità:

  • paranoico (un pattern duraturo di sfiducia e sospetto tale che le motivazioni degli altri sono interpretate come malevole);
  • schizoide (un pattern duraturo di distacco dalle relazioni sociali e una gamma ristretta di espressioni emotive);
  • schizotipico (un pattern duraturo di disagio acuto nelle relazioni sociali, distorsioni cognitive e percettive ed eccentricità comportamentali).

In un campione di 500 pazienti, ciascuno di questi tre tratti è misurato mediante tre metodi di valutazione:

  • un inventario di autovalutazione dei disturbi di personalità;
  • valutazioni dimensionali da un colloquio clinico strutturato sui disturbi della personalità;
  • valutazioni osservazionali effettuate da psicologi.

I dati sono contenuti in una matrice 3 (T) × 3 (M), organizzata in modo tale che le correlazioni tra i diversi tratti (disturbi della personalità: paranoico, schizotipico, schizoide) siano annidate all’interno di ciascun metodo (tipo di valutazione: inventario, colloquio clinico, valutazioni degli osservatori).

I dati sono riportati qui sotto.

sds <- c(3.61,  3.66,  3.59,  2.94,  3.03,  2.85,  2.22,  2.42,  2.04)

cors <- '
  1.000 
  0.290  1.000 
  0.372  0.478  1.000 
  0.587  0.238  0.209  1.000 
  0.201  0.586  0.126  0.213  1.000 
  0.218  0.281  0.681  0.195  0.096  1.000 
  0.557  0.228  0.195  0.664  0.242  0.232  1.000 
  0.196  0.644  0.146  0.261  0.641  0.248  0.383  1.000 
  0.219  0.241  0.676  0.290  0.168  0.749  0.361  0.342  1.000'

covs <- getCov(
  cors, 
  sds = sds, 
  names = c("pari", "szti", "szdi", "parc", "sztc", "szdc", "paro", "szto", "szdo")
  )

La Matrice Multi-Tratto Multi-Metodo (MTMM) si organizza in due tipi di blocchi di coefficienti:

  1. Blocchi di mono-metodo: contengono le correlazioni tra indicatori che provengono dallo stesso metodo di misurazione. Questi blocchi esaminano come diversi indicatori del medesimo tratto si correlano tra loro quando misurati tramite lo stesso strumento.

  2. Blocchi di etero-metodo: includono le correlazioni tra indicatori misurati mediante metodi diversi. Particolarmente significativa è la “diagonale di validità” all’interno di questi blocchi, dove le correlazioni rappresentano stime di validità convergente. In altre parole, misure diverse di costrutti teoricamente simili dovrebbero mostrare forti correlazioni.

Nell’analisi MTMM, una forte correlazione tra metodi che misurano lo stesso tratto evidenzia la validità convergente. Per esempio, potrebbe risultare che diverse misure della personalità schizotipica mostrino correlazioni elevate, con coefficienti ( r ) che variano da 0.676 a 0.749. Al contrario, elementi al di fuori della diagonale nei blocchi di etero-metodo rivelano la validità discriminante, dove le misure di costrutti teoricamente distinti non dovrebbero essere altamente correlate. Questa validità è confermata quando tali correlazioni sono significativamente più basse rispetto a quelle della diagonale di validità, ad esempio, coefficienti che variano da 0.126 a 0.290.

Inoltre, è possibile rilevare gli effetti del metodo esaminando gli elementi al di fuori della diagonale nei blocchi di mono-metodo. Qui, la varianza nelle correlazioni tra diversi tratti misurati con lo stesso metodo, rispetto alle correlazioni tra gli stessi tratti misurati con metodi diversi, riflette l’entità degli effetti del metodo. Ad esempio, le valutazioni dell’osservatore dei tratti della personalità paranoica e schizotipica potrebbero essere più correlate (r = 0.383) rispetto alle loro misure con metodi diversi (ad esempio, la correlazione tra le misure di personalità paranoide e schizotipica, con l’uso rispettivamente dell’inventario e della valutazione dell’osservatore, è di 0.196).

La validità del costrutto è supportata quando i dati indicano alta validità convergente e discriminante con effetti del metodo trascurabili.

Il modello CFA per analizzare la matrice MTMM può includere correlazioni residue tra le specificità di ciascun metodo, supponendo che ogni fattore comune (come paranoid, schizotypal, schizoid) sia identificato da item misurati con metodi diversi e che le specificità di ciascun metodo siano correlate tra loro.

{cite:t}brown2015confirmatory mostra come sia possibile analizzare la matrice MTMM con un modello CFA nel quale si ipotizza che vi siano correlazioni residue tra le specificità di ciascun metodo. Il modello è dunque formulato nel modo seguente: ogni fattore comune (paranoid, schizotypal, schizoid) è identificato dagli item corrispondenti definiti da metodi diversi; le specificità di ciascun metodo, inoltre, sono correlate tra loro.

model <- '
  paranoid    =~ pari + parc + paro
  schizotypal =~ szti + sztc + szto
  schizoid    =~ szdi + szdc + szdo
  pari ~~ szti + szdi
  szti ~~ szdi
  parc ~~ sztc + szdc
  sztc ~~ szdc
  paro ~~ szto + szdo
  szto ~~ szdo
'  

Adattiamo il modello ai dati.

fit <- cfa(
  model, 
  sample.cov = covs, 
  sample.nobs = 500, 
  std.lv = TRUE
)

Esaminiamo la soluzione ottenuta.

summary(fit, fit.measures = TRUE, standardized = TRUE) |>
    print()
lavaan 0.6.17 ended normally after 59 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        30

  Number of observations                           500

Model Test User Model:
                                                      
  Test statistic                                14.371
  Degrees of freedom                                15
  P-value (Chi-square)                           0.498

Model Test Baseline Model:

  Test statistic                              2503.656
  Degrees of freedom                                36
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.001

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -9879.996
  Loglikelihood unrestricted model (H1)      -9872.811
                                                      
  Akaike (AIC)                               19819.992
  Bayesian (BIC)                             19946.430
  Sample-size adjusted Bayesian (SABIC)      19851.209

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.041
  P-value H_0: RMSEA <= 0.050                    0.989
  P-value H_0: RMSEA >= 0.080                    0.000

Standardized Root Mean Square Residual:

  SRMR                                           0.025

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  paranoid =~                                                           
    pari              2.588    0.145   17.833    0.000    2.588    0.712
    parc              2.472    0.121   20.350    0.000    2.472    0.841
    paro              1.747    0.088   19.946    0.000    1.747    0.788
  schizotypal =~                                                        
    szti              2.950    0.132   22.367    0.000    2.950    0.788
    sztc              2.348    0.123   19.047    0.000    2.348    0.768
    szto              2.047    0.089   22.905    0.000    2.047    0.843
  schizoid =~                                                           
    szdi              2.713    0.120   22.526    0.000    2.713    0.769
    szdc              2.438    0.107   22.826    0.000    2.438    0.860
    szdo              1.782    0.073   24.323    0.000    1.782    0.872

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .pari ~~                                                               
   .szti              1.274    0.338    3.774    0.000    1.274    0.217
   .szdi              2.537    0.329    7.703    0.000    2.537    0.441
 .szti ~~                                                               
   .szdi              3.872    0.342   11.329    0.000    3.872    0.746
 .parc ~~                                                               
   .sztc             -0.335    0.210   -1.597    0.110   -0.335   -0.107
   .szdc             -0.608    0.176   -3.461    0.001   -0.608   -0.265
 .sztc ~~                                                               
   .szdc             -0.933    0.188   -4.967    0.000   -0.933   -0.330
 .paro ~~                                                               
   .szto              0.737    0.118    6.240    0.000    0.737    0.413
   .szdo              0.505    0.096    5.274    0.000    0.505    0.368
 .szto ~~                                                               
   .szdo              0.625    0.102    6.158    0.000    0.625    0.478
  paranoid ~~                                                           
    schizotypal       0.381    0.046    8.341    0.000    0.381    0.381
    schizoid          0.359    0.046    7.856    0.000    0.359    0.359
  schizotypal ~~                                                        
    schizoid          0.310    0.047    6.666    0.000    0.310    0.310

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .pari              6.514    0.513   12.695    0.000    6.514    0.493
   .parc              2.529    0.334    7.562    0.000    2.529    0.293
   .paro              1.867    0.179   10.434    0.000    1.867    0.380
   .szti              5.309    0.460   11.529    0.000    5.309    0.379
   .sztc              3.846    0.330   11.654    0.000    3.846    0.411
   .szto              1.704    0.175    9.742    0.000    1.704    0.289
   .szdi              5.080    0.386   13.158    0.000    5.080    0.408
   .szdc              2.085    0.230    9.047    0.000    2.085    0.260
   .szdo              1.005    0.107    9.351    0.000    1.005    0.240
    paranoid          1.000                               1.000    1.000
    schizotypal       1.000                               1.000    1.000
    schizoid          1.000                               1.000    1.000
effectsize::interpret(fit) |>
    print()
    Name      Value Threshold Interpretation
1    GFI 0.99376810      0.95   satisfactory
2   AGFI 0.98130431      0.90   satisfactory
3    NFI 0.99425997      0.90   satisfactory
4   NNFI 1.00061169      0.90   satisfactory
5    CFI 1.00000000      0.90   satisfactory
6  RMSEA 0.00000000      0.05   satisfactory
7   SRMR 0.02482894      0.08   satisfactory
8    RFI 0.98622392      0.90   satisfactory
9   PNFI 0.41427499      0.50           poor
10   IFI 1.00025272      0.90   satisfactory

Per i dati considerati da {cite:t}brown2015confirmatory, l’adattamento del modello MTMM è eccellente. Ciò fornisce forti evidenze di validità di costrutto per i fattori Paranoico, Schizoide e Schizotipico che sono stati ipotizzati.

42.2 Session Info

sessionInfo()
R version 4.3.3 (2024-02-29)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.4.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.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] ggokabeito_0.1.0  viridis_0.6.5     viridisLite_0.4.2 ggpubr_0.6.0     
 [5] ggExtra_0.10.1    bayesplot_1.11.1  gridExtra_2.3     patchwork_1.2.0  
 [9] semTools_0.5-6    semPlot_1.1.6     lavaan_0.6-17     psych_2.4.3      
[13] scales_1.3.0      markdown_1.12     knitr_1.45        lubridate_1.9.3  
[17] forcats_1.0.0     stringr_1.5.1     dplyr_1.1.4       purrr_1.0.2      
[21] readr_2.1.5       tidyr_1.3.1       tibble_3.2.1      ggplot2_3.5.0    
[25] tidyverse_2.0.0   here_1.0.1       

loaded via a namespace (and not attached):
  [1] rstudioapi_0.15.0  jsonlite_1.8.8     datawizard_0.9.1  
  [4] magrittr_2.0.3     TH.data_1.1-2      estimability_1.5  
  [7] nloptr_2.0.3       rmarkdown_2.26     vctrs_0.6.5       
 [10] minqa_1.2.6        effectsize_0.8.7   base64enc_0.1-3   
 [13] rstatix_0.7.2      htmltools_0.5.7    broom_1.0.5       
 [16] Formula_1.2-5      htmlwidgets_1.6.4  plyr_1.8.9        
 [19] sandwich_3.1-0     emmeans_1.10.0     zoo_1.8-12        
 [22] uuid_1.2-0         igraph_2.0.2       mime_0.12         
 [25] lifecycle_1.0.4    pkgconfig_2.0.3    Matrix_1.6-5      
 [28] R6_2.5.1           fastmap_1.1.1      shiny_1.8.0       
 [31] digest_0.6.35      OpenMx_2.21.11     fdrtool_1.2.17    
 [34] colorspace_2.1-0   rprojroot_2.0.4    Hmisc_5.1-1       
 [37] fansi_1.0.6        timechange_0.3.0   abind_1.4-5       
 [40] compiler_4.3.3     withr_3.0.0        glasso_1.11       
 [43] htmlTable_2.4.2    backports_1.4.1    carData_3.0-5     
 [46] performance_0.11.0 ggsignif_0.6.4     MASS_7.3-60.0.1   
 [49] corpcor_1.6.10     gtools_3.9.5       tools_4.3.3       
 [52] pbivnorm_0.6.0     foreign_0.8-86     zip_2.3.1         
 [55] httpuv_1.6.14      nnet_7.3-19        glue_1.7.0        
 [58] quadprog_1.5-8     nlme_3.1-164       promises_1.2.1    
 [61] lisrelToR_0.3      grid_4.3.3         pbdZMQ_0.3-11     
 [64] checkmate_2.3.1    cluster_2.1.6      reshape2_1.4.4    
 [67] generics_0.1.3     gtable_0.3.4       tzdb_0.4.0        
 [70] data.table_1.15.2  hms_1.1.3          car_3.1-2         
 [73] utf8_1.2.4         sem_3.1-15         pillar_1.9.0      
 [76] IRdisplay_1.1      rockchalk_1.8.157  later_1.3.2       
 [79] splines_4.3.3      lattice_0.22-5     survival_3.5-8    
 [82] kutils_1.73        tidyselect_1.2.0   miniUI_0.1.1.1    
 [85] pbapply_1.7-2      stats4_4.3.3       xfun_0.42         
 [88] qgraph_1.9.8       arm_1.13-1         stringi_1.8.3     
 [91] boot_1.3-29        evaluate_0.23      codetools_0.2-19  
 [94] mi_1.1             cli_3.6.2          RcppParallel_5.1.7
 [97] IRkernel_1.3.2     rpart_4.1.23       parameters_0.21.6 
[100] xtable_1.8-4       repr_1.1.6         munsell_0.5.0     
[103] Rcpp_1.0.12        coda_0.19-4.1      png_0.1-8         
[106] XML_3.99-0.16.1    parallel_4.3.3     ellipsis_0.3.2    
[109] bayestestR_0.13.2  jpeg_0.1-10        lme4_1.1-35.1     
[112] mvtnorm_1.2-4      insight_0.19.10    openxlsx_4.2.5.2  
[115] crayon_1.5.2       rlang_1.1.3        multcomp_1.4-25   
[118] mnormt_2.1.1