1

我正在对我的数据进行一些 PCA 分析。这是我第一次尝试这种类型的分析。我有一个包含一千列和几千行的矩阵,我试图通过删除相关变量(在我的例子中是列)来制作一个更小的矩阵。到目前为止一切都很好,但我无法进行下一步。这是一个显示我的数据的示例。

         a1    a2    a3    a4    ....    a1000
item1    10    NA     5     3    ....
item2    0.01  0.5    NA   0.07  ....
item3    0.7   0.2    0.8  0.9   ....
                   .
                   .
                   .

我应用princomp并得到以下结果

                         Comp.1     Comp.2     Comp.3     Comp.4     ...   Comp.1000
Standard deviation     24.1605431 7.31176669 5.96709553 3.56507807   ...
Proportion of Variance  0.7580933 0.06943108 0.04624186 0.01650621   ...
Cumulative Proportion   0.7580933 0.82752438 0.87376624 0.89027245   ...
                                       .
                                       .
                                       .

现在我已经计算了所有内容......我的问题是:我应该使用什么命令来选择不相关的组件并将它们粘贴到一个新的矩阵中(或者干脆去掉相关的)?我如何指定我想要的相关范围?

谢谢,

4

1 回答 1

4

我相信你是追求的scores。根据 for 的帮助?princomp,生成的对象是一个包含元素的列表scores

分数

如果 score = TRUE,则提供的数据在主成分上的得分。仅当提供了 x 并且 covmat 是协方差列表时也提供了,这些才是非空的。对于公式方法,napredict() 用于处理 na.action 省略的值的处理。

让我们设置一个示例(基于示例中的示例?princomp):

summary(pc.cr <- princomp(USArrests, cor = TRUE))
Importance of components:
                          Comp.1    Comp.2    Comp.3     Comp.4
Standard deviation     1.5748783 0.9948694 0.5971291 0.41644938
Proportion of Variance 0.6200604 0.2474413 0.0891408 0.04335752
Cumulative Proportion  0.6200604 0.8675017 0.9566425 1.00000000

您可以使用以下方法调查结果对象str()

str(pc.cr)
List of 7
 $ sdev    : Named num [1:4] 1.575 0.995 0.597 0.416
  ..- attr(*, "names")= chr [1:4] "Comp.1" "Comp.2" "Comp.3" "Comp.4"
 $ loadings: loadings [1:4, 1:4] -0.536 -0.583 -0.278 -0.543 0.418 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "Murder" "Assault" "UrbanPop" "Rape"
  .. ..$ : chr [1:4] "Comp.1" "Comp.2" "Comp.3" "Comp.4"
 $ center  : Named num [1:4] 7.79 170.76 65.54 21.23
  ..- attr(*, "names")= chr [1:4] "Murder" "Assault" "UrbanPop" "Rape"
 $ scale   : Named num [1:4] 4.31 82.5 14.33 9.27
  ..- attr(*, "names")= chr [1:4] "Murder" "Assault" "UrbanPop" "Rape"
 $ n.obs   : int 50
 $ scores  : num [1:50, 1:4] -0.986 -1.95 -1.763 0.141 -2.524 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
  .. ..$ : chr [1:4] "Comp.1" "Comp.2" "Comp.3" "Comp.4"
 $ call    : language princomp(x = USArrests, cor = TRUE)
 - attr(*, "class")= chr "princomp"

现在提取分数:

head(pc.cr$scores)
               Comp.1     Comp.2      Comp.3       Comp.4
Alabama    -0.9855659  1.1333924 -0.44426879  0.156267145
Alaska     -1.9501378  1.0732133  2.04000333 -0.438583440
Arizona    -1.7631635 -0.7459568  0.05478082 -0.834652924
Arkansas    0.1414203  1.1197968  0.11457369 -0.182810896
California -2.5239801 -1.5429340  0.59855680 -0.341996478
Colorado   -1.5145629 -0.9875551  1.09500699  0.001464887
于 2012-12-12T10:51:21.183 回答