Подтвердить что ты не робот

Анализ основных компонентов - как получить вклад (%) каждого параметра в Prin.Comp.?

Я хочу знать, в какой степени измерение/параметр вносит вклад в один из вычисленных основных компонентов.

Описание в реальном мире:

  • У меня есть пять климатических параметров для географического распределения вида.
  • Я выполнил PCA с этими пятью параметрами
  • график PC1 и PC2 показывает интересный образец

Вопрос: Как получить процент вклада (каждого параметра) на каждый ПК?

Что я ожидаю: PC1 составлен до 30% от параметра1, до 50% от параметра2, до 20% от параметра3, 0% от параметра4 и 0% от параметра5. PC2 составлен...

Пример с 5 фиктивными параметрами:

a <- rnorm(10, 50, 20)
b <- seq(10, 100, 10)
c <- seq(88, 10, -8)
d <- rep(seq(3, 16, 3), 2)
e <- rnorm(10, 61, 27)

my_table <- data.frame(a, b, c, d, e)

pca <- princomp(my_table, cor=T)

biplot(pca) # same: plot(pca$scores[,1], pca$scores[,2])

pca
summary(pca)

Где моя информация скрыта?

4b9b3361

Ответ 1

Вам нужен компонент $loadings возвращаемого объекта:

R> class(pca$loadings)
[1] "loadings"
R> pca$loadings

Loadings:
  Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
a -0.198  0.713        -0.671       
b  0.600         0.334 -0.170  0.707
c -0.600        -0.334  0.170  0.707
d  0.439        -0.880 -0.180       
e  0.221  0.701         0.678       

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
SS loadings       1.0    1.0    1.0    1.0    1.0
Proportion Var    0.2    0.2    0.2    0.2    0.2
Cumulative Var    0.2    0.4    0.6    0.8    1.0

Обратите внимание, что у этого есть специальный метод print(), который подавляет печать небольших нагрузок.

Если вы хотите, чтобы это как относительный взнос, суммируйте нагрузки на столбец и выражайте каждую загрузку как часть суммы столбца (загрузки), заботясь об использовании абсолютных значений для учета отрицательных нагрузок.

R> load <- with(pca, unclass(loadings))
R> load
      Comp.1       Comp.2      Comp.3     Comp.4        Comp.5
a -0.1980087  0.712680378  0.04606100 -0.6713848  0.000000e+00
b  0.5997346 -0.014945831  0.33353047 -0.1698602  7.071068e-01
c -0.5997346  0.014945831 -0.33353047  0.1698602  7.071068e-01
d  0.4389388  0.009625746 -0.88032515 -0.1796321  5.273559e-16
e  0.2208215  0.701104321 -0.02051507  0.6776944 -1.110223e-16

Этот последний шаг затем дает пропорциональный вклад в каждую главную компоненту

R> aload <- abs(load) ## save absolute values
R> sweep(aload, 2, colSums(aload), "/")
      Comp.1      Comp.2     Comp.3     Comp.4       Comp.5
a 0.09624979 0.490386943 0.02853908 0.35933068 0.000000e+00
b 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
c 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
d 0.21336314 0.006623362 0.54544349 0.09614059 3.728970e-16
e 0.10733880 0.482421595 0.01271100 0.36270762 7.850462e-17

R> colSums(sweep(aload, 2, colSums(aload), "/"))
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 
     1      1      1      1      1

Если использовать предпочтительный prcomp(), то соответствующие загрузки находятся в компоненте $rotation:

R> pca2 <- prcomp(my_table, scale = TRUE)
R> pca2$rotation
         PC1          PC2         PC3        PC4           PC5
a -0.1980087  0.712680378 -0.04606100 -0.6713848  0.000000e+00
b  0.5997346 -0.014945831 -0.33353047 -0.1698602 -7.071068e-01
c -0.5997346  0.014945831  0.33353047  0.1698602 -7.071068e-01
d  0.4389388  0.009625746  0.88032515 -0.1796321 -3.386180e-15
e  0.2208215  0.701104321  0.02051507  0.6776944  5.551115e-17

И соответствующее заклинание теперь:

R> aload <- abs(pca2$rotation)
R> sweep(aload, 2, colSums(aload), "/")
         PC1         PC2        PC3        PC4          PC5
a 0.09624979 0.490386943 0.02853908 0.35933068 0.000000e+00
b 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
c 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
d 0.21336314 0.006623362 0.54544349 0.09614059 2.394391e-15
e 0.10733880 0.482421595 0.01271100 0.36270762 3.925231e-17