【问题标题】:Calculating new variables from Principal Components - PCA in R从主成分计算新变量 - R 中的 PCA
【发布时间】:2016-03-27 09:42:29
【问题描述】:

为了在 R 中学习 PCA,我在 iris 数据集上运行了 princomp() 函数(来自 MASS 包)。我遵循了以下步骤:

 library(MASS)
 irispca<-princomp(iris[-5])
 summary(irispca)
 irispca$loadings

为了计算主成分,我以这种方式使用了负载输出:

 iris_temp2 <- iris
 iris_temp2$Comp.1 <- with(iris_temp2,Sepal.Length*0.361+Petal.Length*0.857+Petal.Width*0.358)
 iris_temp2$Comp.2 <- with(iris_temp2,Sepal.Length*(-0.657)+Sepal.Width*(-0.73)+Petal.Length*0.173)
 iris_temp2$Comp.3 <- with(iris_temp2,Sepal.Length*(-0.582)+Sepal.Width*0.598+Petal.Width*0.546)
 iris_temp2$Comp.4 <- with(iris_temp2,Sepal.Length*0.315+Sepal.Width*(-0.32)+Petal.Length*(-0.48)+Petal.Width*0.754)
 iris_temp2 <- with(iris_temp2, iris_temp2[order(Comp.1,Comp.2,Comp.3,Comp.4),])

最后,我对数据集进行了排序。 我也开始知道分数给出了与上述相同的内容,即分数是通过将缩放数据(在其上运行 PCA)与负载相乘来计算的。因此,我想比较分数的输出和 iris_temp2 的输出(具有四个组件)。

 iris_temp1 <- as.data.frame(irispca$scores)
 iris_temp1 <- with(iris_temp1, iris_temp1[order(Comp.1,Comp.2,Comp.3,Comp.4),])

但是,当我执行 head(iris_temp1) 和 head(iris_temp2[,6:9]) 时,输出不匹配。

我会要求你们指出这一观察背后的原因。有什么我误解了吗?如果您需要我的任何其他意见,请告诉我。

我使用过的参考资料有:http://yatani.jp/teaching/doku.php?id=hcistats:pcahttps://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5

谢谢 尚卡尔

【问题讨论】:

  • 我不明白你为什么要手动重新计算 princomp() 已经给你的主成分。
  • 感谢您的回复。我认为,类似的名称在这里造成了混乱。在这里,Comp.1 只不过是使用加载在数据集 iris_temp2 中创建的一个新变量。在这种情况下, irispca$loadings 将给出所需的负载输出,即负载: Comp.1 Comp.2 Comp.3 Comp.4 Sepal.Length 0.361 -0.657 -0.582 0.315 Sepal.Width -0.730 0.598 -0.320 Petal.Length 0.857 0.173 - 0.480 花瓣宽度 0.358 0.546 0.754
  • 现在很清楚,两个 Comp.1 是不同的。希望这可以帮助。如果您还有任何问题,请告诉我。

标签: r pca princomp


【解决方案1】:

princomp不对数据重新排序,每一行都转化为分数,所以比较时不需要重新排序数据。得分包括数据的贬低和特征值矩阵的基数变化。

这意味着首先你需要贬低你的数据,即

library(MASS)
irispca<-princomp(iris[-5])

iris2 <- as.matrix(iris[-5])
iris2 <- sweep(iris2, MARGIN=2, irispca$center, FUN="-")

那么重要的是要意识到princomp对象的打印方法会为了显示目的而舍入值

irispca$loadings

Loadings:
             Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length  0.361 -0.657  0.582  0.315
Sepal.Width         -0.730 -0.598 -0.320
Petal.Length  0.857  0.173        -0.480
Petal.Width   0.358        -0.546  0.754

但是当我们实际检查其中一个组件时,我们会看到它的完整值

irispca$loadings[,1]

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
  0.36138659  -0.08452251   0.85667061   0.35828920

考虑到这一点,我们有

is1 <- list()
is1$Comp.1 <- iris2 %*% irispca$loadings[,1]
is1$Comp.2 <- iris2 %*% irispca$loadings[,2]
is1$Comp.3 <- iris2 %*% irispca$loadings[,3]
is1$Comp.4 <- iris2 %*% irispca$loadings[,4]
score1 <- as.data.frame(is1)

给了

head(score1, 2)

Comp.1     Comp.2     Comp.3      Comp.4
-2.684126 -0.3193972 0.02791483 0.002262437
 2.714142  0.1770012 0.21046427 0.099026550


 head(irispca$scores, 2)
         Comp.1     Comp.2     Comp.3      Comp.4
 [1,] -2.684126 -0.3193972 0.02791483 0.002262437
 [2,] -2.714142  0.1770012 0.21046427 0.099026550

最后要注意的一点是,如果v 是一个主要组件,那么-1 * v 也是一个主要组件。许多用于确定它们的算法并没有明确地强加一个方向。来自文档

负荷和分数列的符号是任意的,并且 所以在不同的 PCA 程序之间可能会有所不同,甚至在 不同版本的 R.

【讨论】:

  • 非常感谢您分享这个详尽的答案。这真的很有帮助。我认为,我犯的错误是我没有像您在上面使用扫描()所做的那样从值中减去平均值。我会注意 princomp 不会重新排序顺序,并且 princomp 对象的打印方法会舍入值以进行显示。再次感谢您。
  • 我只是想知道 - irispca$scale 是什么意思?它为所有 4 个变量给出 1。如果比例值不同于 1 会发生什么?在这种情况下,是否也需要对数据进行除垢?请也分享您对这些观点的意见。
  • 查看stats:::princomp.default 的源代码,如果cor=TRUE,这似乎是用于缩放的标准偏差,否则为1。如果上述答案解决了您的问题,请考虑接受它。
  • 再次感谢您。你的输入是有道理的。我不确定 - 当您说“如果上述答案解决了您的问题,请考虑接受它”时,您的意思是什么。我尝试点击表示“这个答案很有用”的向上箭头符号。
  • 这里是如何做到这一点的概述meta.stackexchange.com/questions/5234/…
猜你喜欢
  • 2018-09-06
  • 2015-07-03
  • 2015-07-29
  • 2022-06-22
  • 2013-03-28
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多