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:
- Chaque ligne de la matrice des facteurs doit contenir au moins un zéro
- S'il y a m facteurs communs, chaque colonne de la matrice des facteurs doit avoir au moins m zéros
- 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
- 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
- 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:
- chaque élément a une charge élevée ou significative sur un seul facteur et
- 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