Một trong những vấn đề quan trọng nhất trong việc sử dụng phân tích nhân tố là giải thích nó. Phân tích nhân tố thường sử dụng luân chuyển nhân tố để tăng cường giải thích. Sau một vòng quay đạt yêu cầu, các yếu tố xoay bốc ma trận L' sẽ có khả năng tương tự để đại diện cho ma trận tương quan và nó có thể được sử dụng như ma trận yếu tố tải, thay vì ma trận không xoay L .
Mục đích của phép quay là làm cho ma trận tải nhân tố xoay có một số thuộc tính mong muốn. Một trong những phương pháp được sử dụng là xoay ma trận tải nhân tố sao cho ma trận xoay sẽ có cấu trúc đơn giản .
LL Thurstone đã giới thiệu Nguyên tắc cấu trúc đơn giản, như một hướng dẫn chung cho xoay vòng nhân tố:
Tiêu chí cấu trúc đơn giản:
- Mỗi hàng của ma trận nhân tố phải chứa ít nhất một số không
- Nếu có m yếu tố chung, mỗi cột của ma trận nhân tố phải có ít nhất m số không
- Đối với mỗi cặp cột trong ma trận nhân tố, cần có một số biến để các mục nhập tiếp cận 0 trong một cột nhưng không có trong các cột khác
- Đối với mỗi cặp cột trong ma trận nhân tố, một tỷ lệ lớn các biến sẽ có các mục nhập gần bằng 0 trong cả hai cột khi có bốn hoặc nhiều yếu tố
- Đối với mỗi cặp cột trong ma trận nhân tố, chỉ nên có một số lượng nhỏ các biến có mục nhập khác trong cả hai cột
Cấu trúc đơn giản lý tưởng là:
- mỗi mục có mức cao, hoặc có ý nghĩa, chỉ tải trên một yếu tố và
- mỗi yếu tố có tải trọng cao, hoặc có ý nghĩa, chỉ cho một số mặt hàng.
Vấn đề là, khi thử một số kết hợp các phương pháp xoay cùng với các tham số mà mỗi phương thức chấp nhận (đặc biệt đối với các phương pháp xiên), số lượng ma trận ứng cử viên tăng lên và rất khó để xem phương pháp nào đáp ứng tốt hơn các tiêu chí trên.
Khi tôi lần đầu tiên đối mặt với vấn đề đó, tôi nhận ra rằng tôi không thể chọn trận đấu tốt nhất bằng cách chỉ 'nhìn' họ và tôi cần một thuật toán để giúp tôi quyết định. Dưới áp lực của thời hạn dự án, điều tôi có thể làm nhất là viết mã sau đây trong MATLAB, chấp nhận một ma trận xoay tại một thời điểm và trả về (theo một số giả định) cho dù mỗi tiêu chí có được đáp ứng hay không. Một phiên bản mới (Nếu tôi từng cố nâng cấp nó) sẽ chấp nhận ma trận 3d (một bộ ma trận 2d) làm đối số và thuật toán sẽ trả về một ma trận phù hợp hơn với các tiêu chí trên.
Làm thế nào bạn sẽ trích xuất một thuật toán ra khỏi các tiêu chí đó? Tôi chỉ hỏi ý kiến của bạn (tôi cũng nghĩ rằng đã có sự chỉ trích về tính hữu ích của phương pháp) và có lẽ cách tiếp cận tốt hơn cho vấn đề lựa chọn ma trận xoay vòng.
Ngoài ra, tôi muốn biết phần mềm nào bạn thích thực hiện FA. Nếu là R, bạn sử dụng gói nào? (Tôi phải thừa nhận rằng nếu tôi phải làm FA, tôi sẽ chuyển sang SPSS một lần nữa). Nếu ai đó muốn cung cấp một số mã, tôi thích R hoặc MATLAB.
PS Công thức tiêu chí cấu trúc đơn giản ở trên có thể được tìm thấy trong cuốn sách "Tạo cảm giác phân tích nhân tố" của PETT, M., LACKEY, N., SULLIVAN, J.
PS2 (từ cùng một cuốn sách): "Một thử nghiệm phân tích nhân tố thành công là mức độ mà nó có thể tái tạo ma trận đúng ban đầu. Nếu bạn cũng sử dụng các giải pháp xiên, trong số tất cả, hãy chọn một trong số đó tạo ra số lượng lớn nhất của yếu tố cao nhất và thấp nhất tải trọng. " Điều này nghe có vẻ như một ràng buộc khác mà thuật toán có thể sử dụng.
PS3 Câu hỏi này cũng đã được hỏi ở đây . Tuy nhiên, tôi nghĩ rằng nó phù hợp hơn trên trang web này.
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