Analyse factorielle pour la validité de construit

Bonjour,

Nous cherchons à établir la validité de construit moyennant l’analyse factorielle exploratoire (EFA).

Pour cela nous avons extrait une série de métriques phonétiques interprétables qui caractérisent différents aspects de la qualité vocalique (N=8) et des métriques purement acoustiques (N=5). Toutes les métriques décrivent la qualité vocalique, mais elles en accentuent différents aspects. Nous cherchons à savoir avec quelles métriques phonétiques vont se regrouper nos métriques acoustiques automatiques, pour comprendre exactement ce qu’elles mesurent (= la validité de construit).

Notre jeu de données semble adéquat pour l’analyse factorielle :

The Bartlett’s test of sphericity (𝜒²(78) = 2624.98, p < .001) and the Kaiser-Meyer-Olkin measure of sampling adequacy (0.75 meeting KMO ‘middling’ criteria). The sample size (N=146) and the subject-to-variable ratio (13.3: 1) met the suitability criteria (MacCallum, Widaman, Zhang, & Hong, 1999; Osborne & Costello, 2004). The Cronbach alpha coefficient for standardized variables indicated high reliability of the data (α = 0.93%).

Notre problème c’est l’instabilité du résultat en fonction de la méthode d’extraction de facteurs et de la librairie sous R :

Avec « EFAtools » (méthode d’extraction : Unweighted least squares pour les données qui se satisfont pas le critère de normalité multivariée) :

model6<-EFA(data, n_factors = 4, method = “ULS”, rotation = “oblimin”)
i ‘x’ was not a correlation matrix. Correlations are found from entered raw data.

print(model6)

EFA performed with type = ‘EFAtools’, method = ‘ULS’, and rotation = ‘oblimin’.

– Rotated Loadings ---------------------------------------------------------------------

      	 F1  	 F2  	 F3  	 F4  

MPS_1_2Hz -.042 -.902 -.287 -.081
MPS_8_16Hz .103 .799 .220 -.042
MPS_16_32H .020 .756 -.472 .046
VDI .714 .073 -.036 -.555
aFCR -.932 -.001 .009 .102
F2RR .789 -.063 .121 -.072
F1RR .781 .050 -.010 .203
mVSD .961 .063 -.016 .057
PILLAI_nei .691 .024 -.010 -.466
pVSA .940 .073 .010 .204
MPS_2_4Hz -.003 -.033 .800 .036
MPS_4_8Hz .093 .237 .915 -.017
mVCD .099 .073 .018 .899

– Factor Intercorrelations -------------------------------------------------------------

 F1  	 F2  	 F3  	 F4  

F1 1.000 -0.456 0.220 -0.202
F2 -0.456 1.000 -0.079 -0.192
F3 0.220 -0.079 1.000 0.029
F4 -0.202 -0.192 0.029 1.000

– Variances Accounted for --------------------------------------------------------------

             	 F1  	 F2  	 F3  	 F4  

SS loadings 6.418 2.176 1.615 0.743
Prop Tot Var 0.494 0.167 0.124 0.057
Cum Prop Tot Var 0.494 0.661 0.785 0.843
Prop Comm Var 0.586 0.199 0.147 0.068
Cum Prop Comm Var 0.586 0.785 0.932 1.000

– Model Fit ----------------------------------------------------------------------------

𝜒²(32) = 5.33, p =1.000
CFI = 1.00
RMSEA [90% CI] = .00 [.00; .00]
AIC = -58.67
BIC = -154.14
CAF = .47

Et avec la librairie « psych », fonction fa(), les mêmes spécifications, nous obtenons une erreur de Heywood (=des estimations négatives des variances ou des estimations de corrélation supérieures à un en valeur absolu) et les coefficients de l’adéquation du modèle (=model fit) inférieurs. A noter également que les corrélations entre les facteurs 1 et 2 sont ici positives (0.46, ce qui est plus logique !) mais elles sont négatives pour le modèle antérieur (-0.456).

factor.data4 <- fa(r = data, nfactors = 4, rotate = “oblimin”, fm = “uls”, scores = TRUE) #estimate model with 6 factors
Warning messages:
1: In fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.
2: In fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, :
An ultra-Heywood case was detected. Examine the results carefully
print(factor.data4)
Factor Analysis using method = uls
Call: fa(r = data, nfactors = 4, rotate = “oblimin”, scores = TRUE,
fm = “uls”)
Standardized loadings (pattern matrix) based upon correlation matrix
ULS1 ULS2 ULS3 ULS4 h2 u2 com
MPS_1_2Hz -0.04 -0.90 -0.25 -0.07 1.01 -0.0132 1.2
MPS_8_16Hz 0.10 0.80 0.19 -0.05 0.80 0.1996 1.2
MPS_16_32Hz 0.02 0.78 -0.51 0.03 0.76 0.2393 1.7
VDI 0.71 0.06 -0.02 -0.54 1.01 -0.0055 1.9
aFCR -0.93 0.01 -0.01 0.09 0.91 0.0860 1.0
F2RR 0.79 -0.07 0.14 -0.06 0.67 0.3348 1.1
F1RR 0.79 0.05 0.00 0.21 0.63 0.3750 1.2
mVSD 0.96 0.06 -0.01 0.07 0.96 0.0427 1.0
PILLAI_ 0.69 0.01 0.00 -0.46 0.83 0.1660 1.7
pVSA 0.94 0.07 0.02 0.22 0.93 0.0747 1.1
MPS_2_4Hz -0.01 -0.06 0.81 0.04 0.64 0.3605 1.0
MPS_4_8Hz 0.08 0.21 0.91 -0.01 0.99 0.0085 1.1
mVCD 0.11 0.09 0.01 0.90 0.82 0.1785 1.0

                              ULS1 ULS2 ULS3 ULS4

SS loadings 5.19 2.32 1.92 1.52
Proportion Var 0.40 0.18 0.15 0.12
Cumulative Var 0.40 0.58 0.73 0.84
Proportion Explained 0.47 0.21 0.18 0.14
Cumulative Proportion 0.47 0.69 0.86 1.00

With factor correlations of
ULS1 ULS2 ULS3 ULS4
ULS1 1.00 0.46 0.23 -0.23
ULS2 0.46 1.00 0.16 0.18
ULS3 0.23 0.16 1.00 0.03
ULS4 -0.23 0.18 0.03 1.00

Mean item complexity = 1.3
Test of the hypothesis that 4 factors are sufficient.

The degrees of freedom for the null model are 78 and the objective function was 18.77 with Chi Square of 2624.98
The degrees of freedom for the model are 32 and the objective function was 2.52

The root mean square of the residuals (RMSR) is 0.02
The df corrected root mean square of the residuals is 0.03

The harmonic number of observations is 146 with the empirical chi square 10.74 with prob < 1
The total number of observations was 146 with Likelihood Chi Square = 345.1 with prob < 3.5e-54

Tucker Lewis Index of factoring reliability = 0.694
RMSEA index = 0.259 and the 90 % confidence intervals are 0.235 0.285
BIC = 185.62
Fit based upon off diagonal values = 1

image

Auriez-vous des pistes où on fait l’erreur et comment en sortir ou bien des lectures à nous recommander ?
Merci d’avance de votre aide,
Anna Marczyk et Ben O’Brien

Bonjour,

Pour nous donner les moyens de réfléchir ensemble à des questions de ce type, une possibilité qui me paraît intéressante serai que le labo se dote d’une plateforme d’analyse partagée, par exemple un cloud R Studio (https://rstudio.cloud/) ou une version serveur de JupyterLab (https://jupyter.org/). On pourrait y créer une boîte à sable pour y déposer des données qu’on cherche à analyser et tester différentes méthodes de traitement possibles.

Noël

Bonjour,

Merci, Noël, pour la suggestion, un tel partage d’interface me semble une bonne idée.
Concernant notre problème, voici les pistes suggérées par Stéphane (grand merci !) :

  • L’erreur de Heywood peut provenir des intervalles de confiance qui encadrent les valeurs de coefficients qu’on cherche à estimer, donc ce n’est pas nécessairement une erreur ;

  • Pour vérifier ce que fait réellement le modèle quand il calcule les coefficients de corrélation (cf. les différences des corrélations entre les facteurs qu’on constate en fonction du package R choisi « EFAtools » ou « psych »), on peut sauvegarder les facteurs en tant que variables continues et examiner leur corrélation. A voir notamment si une valeur aberrante pour un des facteurs cause le problème ;

  • Tester les modèles en introduisant une matrice de corrélations au lieu de données brutes :
    data.cor <- cor(data)
    Attention dans ce cas le modèle ne donnera pas de coefficients de détermination (model fit) car il est impossible de les calculer à partir d’une matrice de corrélations.

Nous allons explorer ces pistes. Si quelqu’un de vous est intéressé par l’analyse factorielle, n´hésitez pas à nous contacter.
Bon week-end,
Anna & Ben