Как получить% дисперсии главного компонента, объясненной в R? сравнение prcomp () и preProcess () - PullRequest
0 голосов
/ 17 июня 2020

Я знаю, что PCA может выполняться с помощью функции prcomp() в базе R или с помощью функции preProcess() в пакете caret, среди прочего.

Во-первых, я прав, говоря что если мы просто используем настройки по умолчанию для операций типа prcomp(<SOME_MATRIX>) или preProcess(<SOME_MATRIX>, method = "pca"), то единственная разница в наших результатах будет в том, что prcomp() не центрирует и не масштабирует данные перед проведением PCA, а preProcess () делает? Следовательно, выводят ли prcomp(scale(<SOME_MATRIX>)) и preProcess(<SOME_MATRIX>, method = "pca") одно и то же?

Во-вторых, что более важно, как мы можем получить% дисперсии, объясняемой каждым P C, на выходе либо prcomp(), либо preProcess()? Из обоих этих выходных данных я могу видеть такие вещи, как средние значения, стандартные отклонения или вращения, но я думаю, что они относятся только к «старым» переменным. Где находится информация о «новых» ПК и какая разница в них приходится?

Это может пригодиться, если, например, я использую preProcess(<SOME_MATRIX>, method = "pca", thresh = 0.8), и это возвращает 6 ПК, но я считаю, что первые 5 ПК объясняют в общей сложности 79,5% дисперсии. Тогда я мог бы быть склонен не включать все 6 ПК.

1 Ответ

2 голосов
/ 17 июня 2020

Поскольку на ваш первый вопрос уже дан ответ, вот ответ на ваш второй вопрос для prcomp. Мы можем получить процентное отклонение, объясняемое каждым P C, позвонив по номеру summary:

df <- iris[1:4]
pca_res <- prcomp(df, scale. = TRUE)
summ <- summary(pca_res)
summ

#Importance of components:
#                          PC1    PC2     PC3     PC4
#Standard deviation     1.7084 0.9560 0.38309 0.14393
#Proportion of Variance 0.7296 0.2285 0.03669 0.00518
#Cumulative Proportion  0.7296 0.9581 0.99482 1.00000

summ$importance[2,]
# PC1     PC2     PC3     PC4 
#0.72962 0.22851 0.03669 0.00518

Насколько я знаю, эта информация недоступна при использовании пакета caret (см. Обсуждаемую проблему здесь ):

mod <- train(Species ~ ., data = iris, method = "knn",
                            preProc = c("center", "scale", "pca"))
str(mod$preProcess) 


List of 22
 $ dim              : int [1:2] 150 4
 $ bc               : NULL
 $ yj               : NULL
 $ et               : NULL
 $ invHyperbolicSine: NULL
 $ mean             : Named num [1:4] 5.84 3.06 3.76 1.2
  ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
 $ std              : Named num [1:4] 0.828 0.436 1.765 0.762
  ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
 $ ranges           : NULL
 $ rotation         : num [1:4, 1:2] 0.521 -0.269 0.58 0.565 -0.377 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
  .. ..$ : chr [1:2] "PC1" "PC2"
 $ method           :List of 4
  ..$ center: chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
  ..$ scale : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
  ..$ pca   : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
  ..$ ignore: chr(0) 
 $ thresh           : num 0.95
 $ pcaComp          : NULL
 $ numComp          : num 2
 $ ica              : NULL
 $ wildcards        :List of 2
  ..$ PCA: chr(0) 
  ..$ ICA: chr(0) 
 $ k                : num 5
 $ knnSummary       :function (x, ...)  
 $ bagImp           : NULL
 $ median           : NULL
 $ data             : NULL
 $ rangeBounds      : num [1:2] 0 1
 $ call             : chr "scrubed"
 - attr(*, "class")= chr "preProcess"
...