从主成分计算新变量 - R 中的 PCA
Calculating new variables from Principal Components - PCA in R
为了学习 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)与载荷相乘来计算的。因此,我想到比较 scores 的输出和 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:pca and https://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5.
谢谢
香卡
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
也是一个主成分,虽然没有被问到但经常会引起混淆。许多用于确定它们的算法并未明确强加方向。来自文档
The signs of the columns of the loadings and scores are arbitrary, and
so may differ between different programs for PCA, and even between
different builds of R.
为了学习 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)与载荷相乘来计算的。因此,我想到比较 scores 的输出和 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:pca and https://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5.
谢谢 香卡
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
也是一个主成分,虽然没有被问到但经常会引起混淆。许多用于确定它们的算法并未明确强加方向。来自文档
The signs of the columns of the loadings and scores are arbitrary, and so may differ between different programs for PCA, and even between different builds of R.