gpt4 book ai didi

algorithm - FA : Choosing Rotation matrix, 基于 "Simple Structure Criteria"

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:42 27 4
gpt4 key购买 nike

使用因子分析最重要的问题之一是它的解释。因子分析通常使用因子旋转来增强其解释。经过满意的旋转后,旋转后的因子加载矩阵L'将具有相同的表示相关矩阵的能力,可以作为因子加载矩阵,代替未旋转的矩阵L.

旋转的目的是使旋转后的因子加载矩阵具有一些理想的性质。使用的方法之一是旋转因子加载矩阵,使旋转后的矩阵具有简单结构

大号。 L. Thurstone 介绍了简单结构原则,作为因子轮换的一般指南:

简单结构标准:

  1. 因子矩阵的每一行应至少包含一个零
  2. 如果有m个公因子,则因子矩阵的每一列至少有m个零
  3. 对于因子矩阵中的每一对列,应该有几个变量的条目在一列中接近零,而在另一列中不接近零
  4. 对于因子矩阵中的每一对列,当有四个或更多因子时,大部分变量在两列中的条目都应该接近于零
  5. 对于因子矩阵中的每一对列,两列中都应该只有少量变量具有非零元素

理想的简单结构是这样的:

  1. 每个项目仅在一个因素上具有高或有意义的负载,并且
  2. 每个因素仅对某些项目具有高负载或有意义的负载。

问题是,尝试几种旋转方法的组合以及每种方法接受的参数(尤其是倾斜的),候选矩阵的数量会增加,很难看出哪一种更符合上述标准。

当我第一次遇到这个问题时,我意识到我无法仅通过“查看”它们来选择最佳匹配,我需要一种算法来帮助我做出决定。在项目截止日期的压力下,我最多只能在 MATLAB 中编写以下代码,它一次接受一个旋转矩阵并返回(在某些假设下)是否满足每个标准。新版本(如果我曾尝试升级它)将接受 3d 矩阵(一组 2d 矩阵)作为参数,算法应返回更符合上述标准的那个。

我只是征求您的意见(我还认为有人批评该方法本身的实用性)以及可能是解决旋转矩阵选择问题的更好方法。如果有人想提供一些代码,我更喜欢 R 或 MATLAB。

附言以上Simple Structure Criteria formulation可以在 PETT, M., LACKEY, N., SULLIVAN, J 所著的"Making Sense of Factor Analysis"一书中找到。

P.S.2(来自同一本书):“成功的因素分析的测试是它可以在多大程度上重现原始的corr矩阵。如果你也使用了斜解,在所有的选择中选择生成最高和最低因子载荷的最大数量。”这听起来像是算法可以使用的另一个约束。

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

最佳答案

我知道这不是你要问的,但即使在其他情况下你也可能会发现这很有用:

MATLAB 应仅在确实不可避免时才使用循环。例如,您的代码

%// 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 6
disp(' ');
disp('CRITERION 6');
ct_lg_meaningful = sum(ct > meaningful,2) %// check where ct>meaningful, and sum along 2nd axis - gives a column vector of number of times each row was larger than meaningful.
criteria_not_met = find((ct_lg_meaningful == 0)|(ct_lg_meaningful>1)) %// in this vector find elements that are 0 or >1
if length(criteria_not_met)>0 %// if we found any elements, display them.
disp(['Criterion 6 is NOT MET for items ' num2str(criteria_not_met')]) %' <- to fix SO syntax highlighting
end

关于algorithm - FA : Choosing Rotation matrix, 基于 "Simple Structure Criteria",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com