4年后,我想对这个问题提供更准确的答案。我以虹膜数据为例。
data = iris[, 1:4]
首先,通过特征分解做 PCA
eigen_res = eigen(cov(data))
l = eigen_res$values
q = eigen_res$vectors
那么最大特征值对应的特征向量就是因子载荷
q[,1]
我们可以将此作为参考或正确答案。现在我们通过不同的 r 函数检查结果。首先,通过函数'princomp'
res1 = princomp(data)
res1$loadings[,1]
# compare with
q[,1]
没问题,这个函数实际上只是返回与 'eigen' 相同的结果。现在转到“校长”
library(psych)
res2 = principal(data, nfactors=4, rotate="none")
# the loadings of the first PC is
res2$loadings[,1]
# compare it with the results by eigendecomposition
sqrt(l[1])*q[,1] # re-scale the eigen vector by sqrt of eigen value
您可能会发现它们仍然不同。问题是'principal'函数默认对相关矩阵进行特征分解。注意:PCA 在重新调整变量时不是不变的。如果将代码修改为
res2 = principal(data, nfactors=4, rotate="none", cor="cov")
# the loadings of the first PC is
res2$loadings[,1]
# compare it with the results by eigendecomposition
sqrt(l[1])*q[,1] # re-scale the eigen vector by sqrt of eigen value
现在,您将得到与 'eigen' 和 'princomp' 相同的结果。
总结:
- 如果你想做PCA,你最好应用'princomp'函数。
- PCA 是因子模型的特例或因子模型的简化版本。它仅相当于特征分解。
- 我们可以应用 PCA 来获得因子模型的近似值。它不关心具体的因素,即因素模型中的epsilons。因此,如果您更改模型中的因子数量,您将获得相同的载荷估计。它不同于最大似然估计。
- 如果你在估计一个因子模型,你最好使用'principal'函数,因为它提供了更多的功能,比如旋转,通过不同的方法计算分数等等。
- 重新调整 PCA 模型的载荷不会对结果产生太大影响。由于您仍然将数据投影到相同的最佳方向,即最大化结果 PC 的变化。