Вычисление новых переменных из главных компонентов - PCA в R

Для изучения PCA на R я запустил функцию princomp() (из пакета MASS) для набора данных iris. Я следовал следующие шаги:

 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:pca и https://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5.

Спасибо Шанкар

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.

Другие вопросы по тегам