Interpréter les écarts entre R et SPSS avec une analyse factorielle exploratoire


14

Je suis un étudiant diplômé en informatique. J'ai fait une analyse factorielle exploratoire pour un projet de recherche. Mes collègues (qui dirigent le projet) utilisent SPSS, alors que je préfère utiliser R. Cela n'a pas d'importance jusqu'à ce que nous découvrions une divergence majeure entre les deux progiciels statistiques.

Nous utilisons la factorisation des axes principaux comme méthode d'extraction (veuillez noter que je suis bien conscient de la différence entre l'ACP et l'analyse factorielle, et que nous n'utilisons pas l'ACP , du moins pas intentionnellement). D'après ce que j'ai lu, cela devrait correspondre à la méthode « de l' axe principal » dans R, et soit « affacturage axe principal » ou « moindres carrés non pondérés » dans SPSS, d' après la documentation R . Nous utilisons une méthode de rotation oblique (spécifiquement, promax ) parce que nous attendons des facteurs corrélés et interprétons la matrice du modèle .

L'exécution des deux procédures dans R et SPSS, il existe des différences majeures. La matrice de motifs donne différents chargements. Bien que cela donne plus ou moins le même facteur aux relations variables, il existe jusqu'à une différence de 0,15 entre les chargements correspondants, ce qui semble plus que prévu par une implémentation différente de la méthode d'extraction et des rotations promax. Cependant, ce n'est pas la différence la plus surprenante.

La variance cumulée expliquée par les facteurs est d'environ 40% dans les résultats SPSS et 31% dans les résultats R. C'est une énorme différence, et cela a amené mes collègues à vouloir utiliser SPSS au lieu de R. Je n'ai aucun problème avec cela, mais une différence aussi grande me fait penser que nous pourrions interpréter quelque chose de manière incorrecte, ce qui est un problème.

Muddying les eaux encore plus, SPSS signale différents types de variance expliquée lorsque nous exécutons l'affacturage des moindres carrés non pondéré. La proportion de la variance expliquée par les valeurs propres initiales est de 40%, tandis que la proportion de la variance expliquée des sommes d'extraction des charges au carré (SSL) est de 33%. Cela m'amène à penser que les valeurs propres initiales ne sont pas le nombre approprié à regarder (je soupçonne que c'est la variance expliquée avant la rotation, bien qu'elle soit si grande me dépasse). Encore plus déroutant, SPSS affiche également Rotation SSL, mais ne calcule pas le pourcentage de variance expliquée (SPSS me dit que le fait d'avoir des facteurs corrélés signifie que je ne peux pas ajouter de SSL pour trouver la variance totale, ce qui est logique avec les calculs que j'ai vus). Les SSL signalés par R ne correspondent à aucun de ceux-ci, et R me dit qu'il décrit 31% de la variance totale. Les SSL de R correspondent le plus étroitement aux SSL de rotation. Les valeurs propres de R de la matrice de corrélation d'origine correspondent aux valeurs propres initiales de SPSS.

Veuillez également noter que j'ai joué avec différentes méthodes et que les ULS et PAF de SPSS semblent correspondre à la méthode de PA de R la plus proche.

Mes questions spécifiques:

  1. Quelle différence dois-je attendre entre R et SPSS avec les implémentations d'analyse factorielle?
  2. Laquelle des sommes des charges carrées de SPSS dois-je interpréter, valeurs propres initiales, extraction ou rotation?
  3. Y a-t-il d'autres problèmes que j'aurais pu ignorer?

Mes appels à SPSS et R sont les suivants:

SPSS:

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT INITIAL KMO AIC EXTRACTION ROTATION
/FORMAT BLANK(.35)
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION PROMAX(4).

R:

library(psych)
fa.results <- fa(data, nfactors=6, rotate="promax",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)

Je ne peux pas le vérifier car je n'utilise pas R, mais je soupçonne qu'il y a une erreur dans la documentation. fm = "pa" doit correspondre à / EXTRACTION PAF. Essayez également de comparer les solutions avant toute rotation, car de légères différences d'algues de rotation peuvent se mélanger avec les différences de méthode d'extraction.
ttnphns

1
Merci d'avoir regardé! J'essaierai de comparer les solutions avant rotation. Je dois mentionner que j'ai essayé les deux / EXTRACTION ULS et / EXTRACTION PAF, et il y a très peu de différence dans les chargements (mais aucun n'est vraiment proche de la méthode R "pa"). La raison pour laquelle je montre / EXTRACTION ULS ci-dessus est parce que c'est la commande qui donne les différents SSL.
Oliver

1
La méthode de l'axe principal et les méthodes des moindres carrés non pondérés peuvent parfois donner des résultats similaires, mais elles sont fondamentalement différentes sur le plan algorithmique. Je crois que les équivalences entre R et SPSS sont les suivantes: "pa" = PAF, "minres" = ULS, "gls" = GLS, "ml" = ML
ttnphns

1
Vérifiez également le traitement des valeurs manquantes. Dans votre code SPSS, vous les supprimez par paire. Dans votre code R - ...?
ttnphns

J'ai comparé les SSL de pré-rotation de R et ils correspondent aux SSL d'extraction dans la solution ULS de SPSS (malheureusement, la solution PAF dans SPSS ne m'a pas donné ces valeurs). Je pense que la rotation promax semble être le coupable. Eh bien, cela ou la façon dont SPSS imprime les SSL de rotation. Peut-être que R fait une estimation de la variance totale expliquée par les SSL finaux, tandis que SPSS me dit qu'aucune estimation de ce type n'est appropriée.
Oliver

Réponses:


21

Tout d'abord, j'appuie la recommandation ttnphns de regarder la solution avant la rotation. L'analyse factorielle telle qu'elle est implémentée dans SPSS est une procédure complexe en plusieurs étapes, la comparaison du résultat de chacune de ces étapes devrait vous aider à identifier le problème.

Plus précisément, vous pouvez exécuter

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT CORRELATION
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.

pour voir la matrice de corrélation que SPSS utilise pour effectuer l'analyse factorielle. Ensuite, dans R, préparez vous-même la matrice de corrélation en exécutant

r <- cor(data)

Toute divergence dans la façon dont les valeurs manquantes sont traitées doit être évidente à ce stade. Une fois que vous avez vérifié que la matrice de corrélation est la même, vous pouvez l'alimenter à la fonction fa et relancer votre analyse:

fa.results <- fa(r, nfactors=6, rotate="promax",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)

Si vous obtenez toujours des résultats différents dans SPSS et R, le problème ne manque pas de valeurs liées.

Ensuite, vous pouvez comparer les résultats de la méthode d'analyse factorielle / d'extraction elle-même.

FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT EXTRACTION
/FORMAT BLANK(.35)
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.

et

fa.results <- fa(r, nfactors=6, rotate="none", 
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)

Encore une fois, comparez les matrices factorielles / les communautés / la somme des charges au carré. Ici, vous pouvez vous attendre à de minuscules différences mais certainement pas de l'ampleur que vous décrivez. Tout cela vous donnerait une idée plus claire de ce qui se passe.

Maintenant, pour répondre directement à vos trois questions:

  1. D'après mon expérience, il est possible d'obtenir des résultats très similaires, parfois après avoir passé un certain temps à comprendre les différentes terminologies et à jouer avec les paramètres. J'ai eu à plusieurs reprises des analyses factorielles dans SPSS et R (travaillant généralement dans R puis reproduisant l'analyse dans SPSS pour la partager avec des collègues) et j'ai toujours obtenu essentiellement les mêmes résultats. Je ne m'attendrais donc généralement pas à de grandes différences, ce qui m'amène à penser que le problème pourrait être spécifique à votre ensemble de données. J'ai cependant essayé rapidement les commandes que vous avez fournies sur un ensemble de données que je traînais (c'est une échelle de Likert) et les différences étaient en fait plus importantes que d'habitude mais pas aussi grandes que celles que vous décrivez. (Je pourrais mettre à jour ma réponse si j'ai plus de temps pour jouer avec ça.)
  2. La plupart du temps, les gens interprètent la somme des charges au carré après rotation comme la «proportion de variance expliquée» par chaque facteur, mais cela n'a pas de sens après une rotation oblique (c'est pourquoi elle n'est pas du tout rapportée dans les rapports psych et SPSS uniquement) les valeurs propres dans ce cas - il y a même une petite note à ce sujet dans la sortie). Les valeurs propres initiales sont calculées avant toute extraction de facteur. De toute évidence, ils ne vous disent rien sur la proportion de variance expliquée par vos facteurs et ne sont pas vraiment non plus une «somme de charges au carré» (ils sont souvent utilisés pour décider du nombre de facteurs à retenir). SPSS «Extraction Sums of Squared Loadings» devrait cependant correspondre aux «SS loadings» fournis par psych .
  3. C'est une supposition sauvage à ce stade, mais avez-vous vérifié si la procédure d'extraction des facteurs a convergé en 25 itérations? Si la rotation ne parvient pas à converger, SPSS ne génère aucune matrice de motif / structure et vous ne pouvez pas la manquer, mais si l'extraction ne parvient pas à converger, la dernière matrice de facteurs s'affiche néanmoins et SPSS continue avec bonheur la rotation. Vous verriez cependant une note «a. Vous avez tenté d'extraire 6 facteurs. Plus de 25 itérations requises. (Convergence = XXX). L'extraction s'est terminée. »Si la valeur de convergence est petite (quelque chose comme .005, la condition d'arrêt par défaut étant« moins de .0001 »), elle ne tiendra toujours pas compte des écarts que vous signalez, mais si elle est vraiment grande, il y a quelque chose de pathologique sur vos données.

2
Très belle réponse. J'allais suggérer (si possible) à l'auteur de fournir un exemple de matrice de corrélation pour voir où réside le problème. Il ne devrait pas être trop difficile de le truquer / de le rendre suffisamment ambigu pour partager les données. Aussi, si l'on ne peut pas reproduire le problème en commençant directement avec la même matrice de corrélation qui identifie en partie le problème.
Andy W

Merci, c'est une réponse fantastique. Je vais suivre ces étapes une fois que je serai de retour sur ma machine SPSS. En réponse à # 3, la solution converge en 9 itérations, mais je garderai cela à l'esprit pour toutes les analyses futures que je ferai. Il était très utile de savoir que les différences ne sont généralement pas aussi importantes que je l'ai décrit (je travaille également avec des données d'échelle de Likert, 5 points).
Oliver

Au cas où quelqu'un d'autre se le demanderait, la fafonction dans R provient du psychpackage. La factanalfonction du package de base devrait fonctionner de la même manière, mais psychvaut quand même la peine d'être utilisée à d'autres fins. En fait, comme il s'agit de données Likert, il serait judicieux d'utiliser les psychpackages à la fa.polyplace: voir la documentation d'aide .
Nick Stauner

6

Récemment, j'ai constaté que la plupart des écarts d'analyse factorielle entre SPSS et R (avec le package Psych) disparaissent lorsque les données sont traitées dans le sens de la liste manquante dans chaque programme, la matrice de corrélation apparaît exactement la même dans chacun, et aucune rotation oblique n'est utilisée.

Une divergence qui subsiste est dans la série de valeurs qui apparaissent dans le tracé d'éboulis indiquant les valeurs propres après l'extraction. Dans «éboulis (cor (mydata))» de R, ces «facteurs» ne correspondent pas à ceux répertoriés dans le tableau des écarts expliqués de SPSS sous «Somme d'extraction des charges au carré». Notez que les "composants" du tracé d'aperçu R correspondent au tracé d'aperçu de SPSS, qui correspond également aux "valeurs propres initiales" de sa table Variance Explained.

J'ai également constaté que le "Var de la proportion" expliqué par chaque facteur est, dans R, parfois rapporté comme (la proportion pour un facteur donné) / (le montant expliqué par tous les facteurs), tandis qu'à d'autres moments il l'est (la proportion pour un facteur donné) (le nombre d'éléments dans l'analyse). Donc, si vous obtenez le premier, il est, bien qu'il ne s'agisse pas d'une correspondance, au moins proportionnel et dérivable de ce que SPSS rapporte sous «Somme d'extraction des charges au carré ...% de variance».

L'introduction de la rotation oblimin dans chaque programme, cependant, crée des écarts importants dans le chargement des articles ou la variance des facteurs a expliqué que je n'ai pas été en mesure de résoudre.


1

La méthode de rotation par défaut dans R est oblimin, donc cela causera probablement la différence. En tant que test, exécutez un PAF / oblimin dans SPSS et R et vous trouverez des résultats presque identiques.


0

Je ne sais pas ce qui cause les différences dans les chargements de modèle, mais je suppose que la différence en% de la variance expliquée est due à: - interprétez-vous peut-être la première partie (de 2 ou 3) du tableau de variance expliquée SPSS qui montre réellement résultats de l'analyse en composantes principales. La deuxième partie présente les résultats des résultats de l'analyse factorielle non tournée et les troisièmes résultats après rotation (si utilisés). - le fait que la fonction fa (ou plus précisément sa méthode d'impression) calcule incorrectement SSL pour les facteurs obliques. Pour obtenir le% de la variance totale expliqué par facteur, vous devez calculer la somme des charges structurelles au carré par facteur et diviser cela par le nombre de variables. Cependant, vous ne pouvez pas les résumer (en cas de rotations obliques) pour obtenir le% de variance expliqué par tous les facteurs. Pour l'obtenir,


Bienvenue sur le site, @AlesZiberna. Nous essayons de construire un référentiel permanent d'informations statistiques sous forme de questions et réponses. Donc, une chose qui nous préoccupe est le linkrot. Pourriez-vous fournir un aperçu des informations sur le lien au cas où elles disparaissent, et ainsi les lecteurs peuvent décider s'ils veulent les poursuivre?
gung - Rétablir Monica

0

Cette réponse s'ajoute à celles ci-dessus. Comme l'a suggéré Gala dans sa réponse, il faut d'abord déterminer si les solutions fournies par R (par exemple fa en psych) et SPSS sont différentes avant la rotation. S'ils sont identiques, examinez les paramètres de rotation de chaque programme. (Pour SPSS, vous pouvez trouver tous les paramètres dans l'entrée de manuel de référence pour FACTOR).

Un paramètre important à rechercher est la normalisation de Kaiser . Par défaut, SPSS effectue la normalisation de Kaiser pendant la rotation, contrairement à certaines fonctions R comme «fa». Vous pouvez contrôler ce paramètre dans SPSS en spécifiant / CRITERIA = NOKAISER / KAISER, pour vérifier s'il élimine les écarts entre les résultats avec chaque programme.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.