R PCA:主体(心理包)与 prcomp 负载

机器算法验证 r 主成分分析 因子分析
2022-03-16 09:22:06

我有几个关于使用prcompprincipal(来自psych)包执行 PCA时加载值的差异的问题

使用以下方法进行 PCA 时prcomp

pca_results <- prcomp(df, center = TRUE, scale. = TRUE)
pca_results$rotation[,1:5]

我得到以下负载:

              PC1          PC2           PC3           PC4           PC5
q3   -0.016809164  0.134292686 -0.1757822345  1.108893e-01 -0.1319508350
q5    0.050866015 -0.161877460  0.0892043331  2.767157e-02  0.1474154691
q8   -0.008870246 -0.015767530  0.0115132365  1.618538e-01  0.2722705733

principalpsych包装中使用时:

pca_fit <- principal(df, nfactors = 5, rotate = "none")
pca_fit$loadings

我得到了这些加载值:

     PC1    PC2    PC3    PC4    PC5   
q3          -0.335 -0.369  0.207  0.211
q5   -0.149  0.403  0.187        -0.235
q8                         0.301 -0.435

我的第一个问题:为什么两种方法之间的加载值存在差异?哪个是对的?我也尝试prcompcenterscale设置为,FALSE但数字仍然不匹配

我的第二个问题:负载中的缺失principal表明了什么?是加载值的某个阈值,低于该阈值什么都没有显示?

1个回答

正如我从您的数据中看到的那样 - 区别仅在于缩放。例如,PC3 用缩放,有些用负数缩放。因此,两种算法都是正确的,因为主方向不会随着正缩放而改变,而负缩放编码相同的空间。psych=2.099188243053083prcomp

为了查看全貌 - 您可以查看特征值(来自 sdev - 特征值的平方根):

pca_results <- prcomp(df, center = TRUE, scale. = TRUE)
> pca_results$rotation[,1:4]
                    PC1         PC2        PC3        PC4
Sepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863
Sepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096
Petal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492
Petal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971

> pca_results$sdev
[1] 1.7083611 0.9560494 0.3830886 0.1439265

将其与 psych 的载荷进行比较(“特征值”在这里称为 SS 载荷):

> pca_fit <- principal(df, nfactors = 4, rotate = "none")
> pca_fit$loadings

Loadings:
             PC1    PC2    PC3    PC4   
Sepal.Length  0.890  0.361 -0.276       
Sepal.Width  -0.460  0.883              
Petal.Length  0.992                0.115
Petal.Width   0.965         0.243       

                 PC1   PC2   PC3   PC4
SS loadings    2.918 0.914 0.147 0.021
Proportion Var 0.730 0.229 0.037 0.005
Cumulative Var 0.730 0.958 0.995 1.000

您可以看到它们是相同的(平方后)。所以算法输出相同的因子,它们只是表示不同的主要方向:prcomp 中的特征向量(单位长度),psych 中的载荷(非单位长度)。

所以, psych 唯一的“问题”是它的向量没有单位长度。prcomp 向量的长度为 1,例如对于 PC1:

prcomp: 0.5210659 * 0.5210659 + 0.2693474 * 0.2693474 + 0.5804131 * 0.5804131 + 0.5648565 * 0.5648565 = 0.99999992627343

psych: 0.890 * 0.890 + 0.460 * 0.460 + 0.992 * 0.992 + 0.965 * 0.965 = 2.918989

PS 是的,psych包没有显示小于 epsilon 的值,这就是为什么那里有一些空单元格的原因。编辑:正如@William Revelle 指出的那样,“小负载被丢弃的原因是负载对象属于“负载”类,而 R print 丢弃的值小于.3. 取消对负载进行分类(unclass(pca_fit$loadings),然后打印它们。”


事实上,加载psych不是单位特征向量,因为它使用它们进行因子旋转。这就是为什么载荷是由各自特征值的平方根缩放的特征向量(即使您指定不旋转)。https://stats.stackexchange.com/a/137003/137805