29.1 Un numero di fattori troppo piccolo

Una delle possibili fonti di mancanza di adattamento del modello può dipendere dal fatto che è stato ipotizzato un numero insufficiente di fattori latenti comuni. Brown (2015) discute il caso nel quale si confrontano gli indici di bontà di adattamento di un modello ad un solo fattore comune e un modello a due fattori comuni. L’esempio riguarda i dati già in precedenza discussi e relativi relativi a 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).

Leggiamo i dati in \(\mathsf{R}\).

varnames <- c("N1", "N2", "N3", "N4", "E1", "E2", "E3", "E4")

sds <- c(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

Supponiamo di adattare ai dati il modello “sbagliato” che include un unico fattore comune. Svolgiamo qui l’analisi fattoriale esplorativa usando la funzione sperimentale efa() di lavaan.

# 1-factor model
f1 <- '
  efa("efa")*f1 =~ N1 + N2 + N3 + N4 + E1 + E2 + E3 + E4
'

Adattiamo il modello ai dati.

efa_f1 <-
  cfa(
    model = f1,
    sample.cov = psychot_cor_mat,
    sample.nobs = 250,
    rotation = "oblimin"
  )

Consideriamo ora un modello a due fattori.

f2 <- '
  efa("efa")*f1 +
  efa("efa")*f2 =~ N1 + N2 + N3 + N4 + E1 + E2 + E3 + E4
'

Adattiamo il modello ai dati.

efa_f2 <-
  cfa(
    model = f2,
    sample.cov = psychot_cor_mat,
    sample.nobs = 250,
    rotation = "oblimin"
  )

Esaminiamo gli indici di bontà di adattamento.

# define the fit measures
fit_measures_robust <- c("chisq", "df", "pvalue", "cfi", "tli", "rmsea", "srmr")

# collect them for each model
rbind(
  fitmeasures(efa_f1, fit_measures_robust),
  fitmeasures(efa_f2, fit_measures_robust)
) %>%
  # wrangle
  data.frame() %>%
  mutate(
    chisq = round(chisq, digits = 0),
    df = as.integer(df),
    pvalue = ifelse(pvalue == 0, "< .001", pvalue)
  ) %>%
  mutate_at(vars(cfi:srmr), ~ round(., digits = 3))
#>   chisq df            pvalue  cfi   tli rmsea  srmr
#> 1   375 20            < .001 0.71 0.594 0.267 0.187
#> 2    10 13 0.709310449320062 1.00 1.006 0.000 0.010
effectsize::interpret(efa_f1)
#>     Name     Value Threshold Interpretation
#> 1    GFI 0.6713421      0.95           poor
#> 2   AGFI 0.4084158      0.90           poor
#> 3    NFI 0.7006460      0.90           poor
#> 4   NNFI 0.5941736      0.90           poor
#> 5    CFI 0.7101240      0.90           poor
#> 6  RMSEA 0.2665811      0.05           poor
#> 7   SRMR 0.1873289      0.08           poor
#> 8    RFI 0.5809044      0.90           poor
#> 9   PNFI 0.5004614      0.50   satisfactory
#> 10   IFI 0.7120036      0.90           poor
effectsize::interpret(efa_f2)
#>     Name       Value Threshold Interpretation
#> 1    GFI 0.990554109      0.95   satisfactory
#> 2   AGFI 0.973842148      0.90   satisfactory
#> 3    NFI 0.992174918      0.90   satisfactory
#> 4   NNFI 1.005603388      0.90   satisfactory
#> 5    CFI 1.000000000      0.90   satisfactory
#> 6  RMSEA 0.000000000      0.05   satisfactory
#> 7   SRMR 0.009907613      0.08   satisfactory
#> 8    RFI 0.983145977      0.90   satisfactory
#> 9   PNFI 0.460652640      0.50           poor
#> 10   IFI 1.002570123      0.90   satisfactory

I risultati mostrano come, in un modello EFA, una soluzione a due fattori produca un adattamento adeguato, mentre ciò non si verifica con un modello ad un solo fattore.

References

Brown, Timothy A. 2015. Confirmatory Factor Analysis for Applied Research. Guilford publications.