使用princomp()和principal()在R中执行PCA时的结果不同

时间:2016-04-16 00:54:39

标签: r pca psych

我尝试使用princomp()principal()在R中使用数据集USArressts执行PCA。但是,我得到两个不同的加载/旋转和分数结果。

首先,我将原始数据框居中并标准化,以便更容易比较输出。

library(psych)

trans_func <- function(x){
  x <- (x-mean(x))/sd(x)
  return(x)
}

A <- USArrests
USArrests <- apply(USArrests, 2, trans_func)

princompPCA <- princomp(USArrests, cor = TRUE)
principalPCA <- principal(USArrests, nfactors=4 , scores=TRUE, rotate = "none",scale=TRUE) 

然后我使用以下命令获得了加载和分数的结果:

princompPCA$loadings
principalPCA$loadings

你能帮我解释为什么会有区别吗?我们如何解释这些结果?

3 个答案:

答案 0 :(得分:1)

?principal的帮助文档的最后:

  

“特征向量由特征值的sqrt重新调整,以产生在因子分析中更典型的分量加载。”

所以principal返回缩放的加载量。实际上,principal生成了一个由主成分方法估计的因子模型。

答案 1 :(得分:1)

在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]

没问题,此函数实际上只返回与“本征”相同的结果。现在移至“主要”

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

您可能会发现它们仍然不同。问题是默认情况下,“主”函数在相关矩阵上进行特征分解。注意: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”相同的结果。

总结:

  1. 如果要执行PCA,最好应用“ princomp”功能。
  2. PCA是因子模型或因子模型的简化版本的特例。这等效于本征分解。
  3. 我们可以应用PCA来获得因子模型的近似值。它不关心特定因素,即因素模型中的ε。因此,如果更改模型中的因子数量,则将获得相同的载荷估算值。它不同于最大似然估计。
  4. 如果您要估算因子模型,则最好使用“主要”功能,因为它提供了更多功能,例如旋转,通过不同方法计算得分等。
  5. 重新缩放PCA模型的负载不会太大地影响结果。由于您仍将数据投影到相同的最佳方向上,即,使最终PC的变化最大化。

答案 2 :(得分:0)

List
[[1]]
                                         V1                           V2
title                      Founder | Co-CEO              some thing here
company                        some company                 some company
date_range     ene. de 2018 \023 actualidad ene. de 2019 \023 actualidad
location                             Europe                          USA
description                some description          another description
li_company_url       https://www.google.com        https://www.yahoo.com

[[2]]
                                   V1                           V2                   V3
title                             CEO                    job title          job title 2
company               another company                 company name         company name
date_range       2012 \023 actualidad ene. de 2005 \023 actualidad 1995 \023 actualidad
description    some other description          company description          description
li_company_url                               https://www.yahoo.com                     
location                         <NA>                       Europe                 <NA>
                                     V4                  V5
title                         job title       company title
company                    company name        company name
date_range               1992 \023 1995      1990 \023 1992
description    soem company description Another description
li_company_url                                             
location                            USA                <NA>

[[3]]
[1] NA