mat*_*mat 12 statistics matlab factor-analysis
我正在尝试在MATLAB中执行以下分析:
Delta值为0的直接Oblimin旋转和"Kaiser归一化"
我知道MATLAB有一个叫做rotatefactors的函数,但是没有提到oblimin旋转(既没有"Kaiser Normalization").如何在MATLAB中执行此分析?
更具体地说,我正在尝试在执行此分析时匹配SPSS的确切输出.
在这里,您可以找到SPSS中使用的所有算法:link(请参阅第338页的oblimin旋转).不幸的是,我无法理解方程式,因此在MATLAB中重现它们.
例如,我使用以下数据:
A = magic(10);
writetable(array2table(A),'test.xlsx') % This data can be imported to SPSS
Run Code Online (Sandbox Code Playgroud)
我执行PCA(在相关矩阵上)并仅提取2个因子.以下是在MATLAB中完成的方法,以获得与SPSS(他们称之为"组件矩阵")完全相同的加载矩阵:
[eigvector,eigmatrix] = eig(corr(A));
[~,ind] = sort(diag(eigmatrix),'descend');
eigmatrix = eigmatrix(ind,ind);
eigvector = eigvector(:,ind);
eigvalues = diag(eigmatrix); % Eigeinvalues
loadings = eigvector*sqrt(eigmatrix);
loadings = loadings(:,1:2) % Extract only 2 factors
Run Code Online (Sandbox Code Playgroud)
接下来,我应该loadings使用函数在矩阵上执行旋转rotatefactors,这就是我被卡住的地方.
这是SPSS中的语法:
FACTOR
/VARIABLES A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
/MISSING LISTWISE
/ANALYSIS A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
/PRINT INITIAL EXTRACTION ROTATION
/CRITERIA FACTORS(2) ITERATE(25)
/EXTRACTION PC
/CRITERIA ITERATE(25) DELTA(0)
/ROTATION OBLIMIN
/METHOD=CORRELATION.
Run Code Online (Sandbox Code Playgroud)
这是SPSS的输出,我试图在MATLAB中重现:
MATLAB 尚未实现 OBLIMIN 旋转方法,因为 promax 方法执行相同的操作,只是速度要快得多。
与 SPSS OBLIMIN 输出相比,使用此方法不会获得完全相同的输出,但它们应该非常接近,因为它们正在执行相同的操作。(实际上,promax也是一种倾斜旋转,只不过在放松正交性之前它首先通过正交旋转来近似)
也许可以在 promax 内部自定义正交旋转,但我认为您永远不会得到相同的输出。
为了进行 promax 旋转:
[B,T]=rotatefactors(loadings,'method','promax');
% Your pattern matrix is in B, to get the structure matrix, you can do :
S=B*inv(T'*T);
Run Code Online (Sandbox Code Playgroud)
请注意,旋转是以角度 pi 为模定义的,因此您将得到一个等于 +- 您想要的输出矩阵。
在您的示例上运行此命令,可以得到以下模式:
B =
-0.0178 0.9765
-0.9528 0.0563
-0.0305 -1.0124
0.9442 -0.0602
0.9897 -0.0155
-0.7625 0.1992
-0.8823 0.0333
-0.9776 -0.1919
-0.7797 0.0719
0.9950 0.0767
Run Code Online (Sandbox Code Playgroud)
连同结构矩阵:
S =
-0.5740 0.9867
-0.9849 0.5990
0.5461 -0.9950
0.9785 -0.5980
0.9985 -0.5791
-0.8760 0.6335
-0.9013 0.5358
-0.8683 0.3649
-0.8206 0.5160
0.9513 -0.4899
Run Code Online (Sandbox Code Playgroud)
因此,这与 SPSS 输出非常接近,但仍然不同。
但我们可以看到,巨大的差异是针对非常小的值。由于相关分析总是取最大值,因此这应该不是什么大问题。
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |