FA: Choix de la matrice de rotation, basée sur des «critères de structure simples»

8

L'une des questions les plus importantes dans l'utilisation de l'analyse factorielle est son interprétation. L'analyse factorielle utilise souvent la rotation des facteurs pour améliorer son interprétation. Après une rotation satisfaisante, la matrice des facteurs de chargement pivotée L » aura la même capacité à représenter la matrice de corrélation et il peut être utilisé en tant que matrice de chargement de facteur, au lieu de la matrice non réorientée L .

Le but de la rotation est de faire en sorte que la matrice de charge à facteur tourné ait certaines propriétés souhaitables. L'une des méthodes utilisées consiste à faire pivoter la matrice de charge factorielle de telle sorte que la matrice tournée ait une structure simple .

LL Thurstone a présenté le principe de la structure simple, comme guide général pour la rotation des facteurs:

Critères de structure simples:

  1. Chaque ligne de la matrice des facteurs doit contenir au moins un zéro
  2. S'il y a m facteurs communs, chaque colonne de la matrice des facteurs doit avoir au moins m zéros
  3. Pour chaque paire de colonnes de la matrice factorielle, il devrait y avoir plusieurs variables pour lesquelles les entrées approchent de zéro dans une colonne mais pas dans l'autre
  4. Pour chaque paire de colonnes dans la matrice des facteurs, une grande proportion des variables devrait avoir des entrées proches de zéro dans les deux colonnes lorsqu'il y a quatre facteurs ou plus
  5. Pour chaque paire de colonnes de la matrice factorielle, il ne devrait y avoir qu'un petit nombre de variables avec des entrées non nulles dans les deux colonnes

La structure simple idéale est telle que:

  1. chaque élément a une charge élevée ou significative sur un seul facteur et
  2. chaque facteur a des charges élevées ou significatives pour seulement certains des articles.

Le problème est que, en essayant plusieurs combinaisons de méthodes de rotation avec les paramètres que chacun accepte (en particulier pour les obliques), le nombre de matrices candidates augmente et il est très difficile de voir laquelle répond le mieux aux critères ci-dessus.

Lorsque j'ai rencontré ce problème pour la première fois, j'ai réalisé que je ne pouvais pas sélectionner la meilleure correspondance en les «regardant» simplement et que j'avais besoin d'un algorithme pour m'aider à décider. Sous la contrainte des délais du projet, le plus que j'ai pu faire était d'écrire le code suivant dans MATLAB, qui accepte une matrice de rotation à la fois et retourne (sous certaines hypothèses) si chaque critère est satisfait ou non. Une nouvelle version (si j'essayais de la mettre à jour) accepterait une matrice 3D (un ensemble de matrices 2D) comme argument, et l'algorithme devrait renvoyer celle qui correspond le mieux aux critères ci-dessus.

Comment extrairez-vous un algorithme de ces critères? Je vous demande simplement vos opinions (je pense également qu'il y a eu des critiques sur l'utilité de la méthode en elle-même) et peut-être de meilleures approches du problème de sélection de la matrice de rotation.

Je voudrais également savoir quel logiciel préférez-vous pour exécuter FA. Si c'est R, quel paquet utilisez-vous? (Je dois admettre que si je devais faire FA, je me tournerais à nouveau vers SPSS). Si quelqu'un veut fournir du code, je préférerais R ou MATLAB.

PS La formulation des critères de structure simple ci-dessus peut être trouvée dans le livre "Making Sense of Factor Analysis" de PETT, M., LACKEY, N., SULLIVAN, J.

PS2 (du même livre): "Un test d'analyse factorielle réussie est la mesure dans laquelle il peut reproduire la matrice corr d'origine. Si vous avez également utilisé des solutions obliques, sélectionnez parmi toutes celle qui a généré le plus grand nombre de facteurs le plus élevé et le plus bas chargements. " Cela ressemble à une autre contrainte que l'algorithme pourrait utiliser.

PS3 Cette question a également été posée ici . Cependant, je pense que cela correspond mieux à ce site.

function [] = simple_structure_criteria (my_pattern_table)
%Simple Structure Criteria
%Making Sense of Factor Analysis, page 132

disp(' ');
disp('Simple Structure Criteria (Thurstone):');
disp('1. Each row of the factor matrix should contain at least one zero');
disp( '2. If there are m common factors, each column of the factor matrix should have at least m zeros');
disp( '3. For every pair of columns in the factor matrix, there should be several variables for which entries approach zero in the one column but not in the other');
disp( '4. For every pair of columns in the factor matrix, a large proportion of the variables should have entries approaching zero in both columns when there are four or more factors');
disp( '5. For every pair of columns in the factor matrix, there should be only a small number of variables with nonzero entries in both columns');
disp(' ');
disp( '(additional by Pedhazur and Schmelkin) The ideal simple structure is such that:');
disp( '6. Each item has a high, or meaningful, loading on one factor only and');
disp( '7. Each factor have high, or meaningful, loadings for only some of the items.');

disp('')
disp('Start checking...')

%test matrix
%ct=[76,78,16,7;19,29,10,13;2,6,7,8];
%test it by giving: simple_structure_criteria (ct)

ct=abs(my_pattern_table);

items=size(ct,1);
factors=size(ct,2);
my_zero = 0.1;
approach_zero = 0.2;
several = floor(items / 3);
small_number = ceil(items / 4);
large_proportion = 0.30;
meaningful = 0.4;
some_bottom = 2;
some_top = floor(items / 2);

% CRITERION 1
disp(' ');
disp('CRITERION 1');
for i = 1 : 1 : items
    count = 0;
    for j = 1 : 1 : factors
        if (ct(i,j) < my_zero)
            count = count + 1;
            break
        end
    end
    if (count == 0)
        disp(['Criterion 1 is NOT MET for item ' num2str(i)])
    end
end


% CRITERION 2
disp(' ');
disp('CRITERION 2');
for j = 1 : 1 : factors 
    m=0;
    for i = 1 : 1 : items
        if (ct(i,j) < my_zero)
            m = m + 1;
        end
    end
    if (m < factors)
        disp(['Criterion 2 is NOT MET for factor ' num2str(j) '. m = ' num2str(m)]);
    end
end

% CRITERION 3
disp(' ');
disp('CRITERION 3');
for c1 = 1 : 1 : factors - 1
    for c2 = c1 + 1 : 1 : factors
        test_several = 0;
        for i = 1 : 1 : items
            if ( (ct(i,c1)>my_zero && ct(i,c2)<my_zero) || (ct(i,c1)<my_zero && ct(i,c2)>my_zero) ) % approach zero in one but not in the other
                test_several = test_several + 1;
            end
        end
        disp(['several = ' num2str(test_several) ' for factors ' num2str(c1) ' and ' num2str(c2)]);
        if (test_several < several)
            disp(['Criterion 3 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2)]);
        end
    end
end

% CRITERION 4
disp(' ');
disp('CRITERION 4');
if (factors > 3)
    for c1 = 1 : 1 : factors - 1
        for c2 = c1 + 1 : 1 : factors
            test_several = 0;
            for i = 1 : 1 : items
                if (ct(i,c1)<approach_zero && ct(i,c2)<approach_zero) % approach zero in both
                    test_several = test_several + 1;
                end
            end
            disp(['large proportion = ' num2str((test_several / items)*100) '% for factors ' num2str(c1) ' and ' num2str(c2)]);
            if ((test_several / items) < large_proportion)
                pr = sprintf('%4.2g',  (test_several / items) * 100 );
                disp(['Criterion 4 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2) '. Proportion is ' pr '%']);
            end
        end
    end
end

% CRITERION 5
disp(' ');
disp('CRITERION 5');
for c1 = 1 : 1 : factors - 1
    for c2 = c1 + 1 : 1 : factors
        test_number = 0;
        for i = 1 : 1 : items
            if (ct(i,c1)>approach_zero && ct(i,c2)>approach_zero) % approach zero in both
                test_number = test_number + 1;
            end
        end
        disp(['small number = ' num2str(test_number) ' for factors ' num2str(c1) ' and ' num2str(c2)]);
        if (test_number > small_number)
            disp(['Criterion 5 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2)]);
        end
    end
end

% CRITERION 6
disp(' ');
disp('CRITERION 6');
for i = 1 : 1 : items
    count = 0;
    for j = 1 : 1 : factors
        if (ct(i,j) > meaningful)
            count = count + 1;
        end
    end
    if (count == 0 || count > 1)
        disp(['Criterion 6 is NOT MET for item ' num2str(i)])
    end
end

% CRITERION 7
disp(' ');
disp('CRITERION 7');
for j = 1 : 1 : factors 
    m=0;
    for i = 1 : 1 : items
        if (ct(i,j) > meaningful)
            m = m + 1;
        end
    end
    disp(['some items = ' num2str(m) ' for factor ' num2str(j)]);
    if (m < some_bottom || m > some_top)
        disp(['Criterion 7 is NOT MET for factor ' num2str(j)]);
    end
end
disp('')
disp('Checking completed.')
return
George Dontas
la source

Réponses:

6

Le package R psych comprend diverses routines pour appliquer l'analyse factorielle (qu'elle soit basée sur PCA, ML ou FA), mais consultez ma courte revue sur crantastic . La plupart des techniques de rotation habituelles sont disponibles, ainsi qu'un algorithme reposant sur des critères de structure simples; vous voudrez peut-être consulter l'article de W. Revelle sur ce sujet, Structure très simple: une procédure alternative pour estimer le nombre optimal de facteurs interprétables (MBR 1979 (14)) et la VSS()fonction.

De nombreux auteurs utilisent la rotation orthogonale (VARIMAX), considérant des charges supérieures à, disons, 0,3 ou 0,4 (ce qui équivaut à 9 ou 16% de la variance expliquée par le facteur), car elle fournit des structures plus simples pour l'interprétation et la notation (par exemple, en qualité recherche sur la vie); d'autres (par exemple Cattell, 1978; Kline, 1979) recommanderaient des rotations obliques car "dans le monde réel, il n'est pas déraisonnable de penser que des facteurs, en tant que déterminants importants du comportement, seraient corrélés" (je cite Kline, Intelligence. The Psychometric View , 1991, p. 19).

À ma connaissance, les chercheurs commencent généralement par FA (ou PCA), en utilisant un éboulis avec des données simulées (analyse parallèle) pour aider à choisir le bon nombre de facteurs. J'ai souvent trouvé que l'analyse des grappes d'articles et VSS complètent bien une telle approche. Lorsque l'on s'intéresse aux facteurs de second ordre, ou pour continuer avec des méthodes basées sur SEM, alors évidemment, vous devez utiliser la rotation oblique et factoriser la matrice de corrélation résultante.

Autres packages / logiciels:

  • lavaan , pour l'analyse des variables latentes dans R;
  • OpenMx basé sur Mx , un logiciel à usage général comprenant un interprète d'algèbre matricielle et un optimiseur numérique pour la modélisation d'équations structurelles.

Références
1. Cattell, RB (1978). L'utilisation scientifique de l'analyse factorielle en sciences du comportement et des sciences de la vie. New York, plénum.
2. Kline, P. (1979). Psychométrie et psychologie. Londres, Academic Press.

chl
la source
3

Je me retrouve régulièrement en utilisant l'analyse parallèle (O'Connor, 2000). Cela résout le problème du nombre de facteurs à extraire correctement.

Voir: https://people.ok.ubc.ca/brioconn/nfactors/nfactors.html

O'Connor, BP (2000). Programmes SPSS et SAS pour déterminer le nombre de composants en utilisant l'analyse parallèle et le test MAP de Velicer. Méthodes de recherche comportementale, instrumentation et ordinateurs, 32, 396-402.


la source
(+1) Je suis tombé sur le site Web d'O'Connor il y a quelques années et il a beaucoup de ressources utiles. Ravi que vous le liez ici.
chl
3

Il faudrait que j'appuie la suggestion de chl sur le paquet psych, son extrêmement utile et a des implémentations du MAP et des critères d'analyse parallèle pour un certain nombre de facteurs. D'après ma propre expérience, j'ai constaté que si vous créez des solutions d'analyse factorielle pour tous les nombres entre ceux renvoyés par MAP et l'analyse parallèle, vous pouvez normalement trouver une solution relativement optimale.

Je soutiendrais également l'utilisation d'OpenMx pour l'analyse factorielle confirmatoire, car elle semble donner les meilleurs résultats pour chacun d'entre eux, et est beaucoup, beaucoup mieux pour les matrices mal comportées (comme la mienne a tendance à l'être). La syntaxe est également assez agréable, une fois que vous vous y êtes habitué. Le seul problème que j'ai avec lui est que l'optimiseur n'est pas open source, et donc il n'est pas disponible sur CRAN. Apparemment, ils travaillent sur une implémentation open source de l'optimiseur, de sorte que ce ne soit peut-être plus un problème pendant plus longtemps.

richiemorrisroe
la source
(+1) Merci d'avoir partagé votre expérience. J'ai souvent observé qu'un bon compromis est trouvé simplement en regardant le tracé d'éboulis tout en considérant la règle de Kayser comme une limite inférieure et les données simulées comme une limite supérieure. Ce que j'aime, psychc'est qu'il affiche des tracés d'éboulis simulés à la fois par PCA et FA.
chl
2

Grande question. Ce n'est pas vraiment une réponse, mais juste quelques réflexions.

Dans la plupart des applications où j'ai utilisé l'analyse factorielle, autoriser les facteurs corrélés est plus théorique. J'ai tendance à me fier à la méthode de rotation proxmax. J'avais l'habitude de le faire dans SPSS et maintenant j'utilise la factanalfonction dans R.

Jeromy Anglim
la source