Salah satu masalah terpenting dalam menggunakan analisis faktor adalah interpretasinya. Analisis faktor sering menggunakan rotasi faktor untuk meningkatkan interpretasinya. Setelah rotasi yang memuaskan, matriks pemuatan faktor yang diputar L ' akan memiliki kemampuan yang sama untuk mewakili matriks korelasi dan dapat digunakan sebagai matriks pemuatan faktor, bukan matriks L yang tidak diputar .
Tujuan rotasi adalah untuk membuat matriks loading factor yang diputar memiliki beberapa sifat yang diinginkan. Salah satu metode yang digunakan adalah memutar matriks pemuatan faktor sehingga matriks yang diputar akan memiliki struktur sederhana .
LL Thurstone memperkenalkan Prinsip Struktur Sederhana, sebagai panduan umum untuk rotasi faktor:
Kriteria Struktur Sederhana:
- Setiap baris matriks faktor harus mengandung setidaknya satu nol
- Jika ada faktor-faktor umum m, setiap kolom dari matriks faktor harus memiliki setidaknya m nol
- Untuk setiap pasangan kolom dalam matriks faktor, harus ada beberapa variabel yang entri mendekati nol di satu kolom tetapi tidak di yang lain
- Untuk setiap pasangan kolom dalam matriks faktor, sebagian besar variabel harus memiliki entri mendekati nol di kedua kolom ketika ada empat atau lebih faktor
- Untuk setiap pasangan kolom dalam matriks faktor, seharusnya hanya ada sejumlah kecil variabel dengan entri nol di kedua kolom
Struktur sederhana yang ideal adalah sedemikian rupa sehingga:
- setiap item memiliki muatan tinggi, atau bermakna, dengan satu faktor saja dan
- setiap faktor memiliki muatan tinggi, atau bermakna, hanya untuk beberapa item.
Masalahnya adalah bahwa, mencoba beberapa kombinasi metode rotasi bersama dengan parameter yang diterima masing-masing (terutama untuk yang miring), jumlah matriks kandidat meningkat dan sangat sulit untuk melihat mana yang lebih baik memenuhi kriteria di atas.
Ketika saya pertama kali menghadapi masalah itu, saya menyadari bahwa saya tidak dapat memilih pasangan yang cocok hanya dengan 'melihat' mereka, dan bahwa saya membutuhkan algoritma untuk membantu saya memutuskan. Di bawah tekanan tenggat waktu proyek, yang paling bisa saya lakukan adalah menulis kode berikut dalam MATLAB, yang menerima satu matriks rotasi pada suatu waktu dan mengembalikan (berdasarkan beberapa asumsi) apakah setiap kriteria terpenuhi atau tidak. Versi baru (Jika saya pernah mencoba untuk memutakhirkannya) akan menerima matriks 3d (seperangkat matriks 2d) sebagai argumen, dan algoritma harus mengembalikan yang lebih sesuai dengan kriteria di atas.
Bagaimana Anda mengekstrak algoritma dari kriteria tersebut? Saya hanya meminta pendapat Anda (saya juga berpikir bahwa ada kritik atas kegunaan metode dengan sendirinya) dan mungkin pendekatan yang lebih baik untuk masalah pemilihan matriks rotasi.
Saya juga ingin tahu perangkat lunak apa yang Anda sukai untuk melakukan FA. Jika R, paket apa yang Anda gunakan? (Saya harus mengakui bahwa jika saya harus melakukan FA, saya akan beralih ke SPSS lagi). Jika seseorang ingin memberikan beberapa kode, saya lebih suka R atau MATLAB.
PS Formulasi Kriteria Struktur Sederhana di atas dapat ditemukan dalam buku "Membuat Analisis Faktor Akal" oleh PETT, M., LACKEY, N., SULLIVAN, J.
PS2 (dari buku yang sama): "Tes analisis faktor yang berhasil adalah sejauh mana ia dapat mereproduksi matriks kor asli. Jika Anda juga menggunakan solusi miring, di antara semua pilih yang menghasilkan jumlah terbesar dari faktor tertinggi dan terendah. pemuatan. " Ini terdengar seperti kendala lain yang bisa digunakan algoritma.
PS3 Pertanyaan ini juga telah ditanyakan di sini . Namun, saya pikir ini lebih cocok di situs ini.
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