Z-стандартизация делает PC1 и PC2 абсолютно одинаковыми в этом анализе PCA: почему? - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь выполнить анализ PCA, используя пакет psy в R.

Я получил две переменные, которые хочу объединить в один компонент, отображающий уровень жизни:

  • slvpen: Уровень жизни пенсионеров: 0 = Очень плохо, 10 = Очень хорошо.
  • slvuemp: Уровень жизни безработных: 0 = Очень плохо, 10 = Очень хорошо.

slvpens:

Min. 1st Qu. Median Mean 3rd Qu. Max. Standard Deviation 0.000 3.000 5.000 4.587 6.000 10.000 2.28857

slvuemp:

Min. 1st Qu. Median Mean 3rd Qu. Max. Standard Deviation 0.000 3.000 4.000 4.095 5.000 10.000 2.099822

Использование phych -пакет, я провожу анализ:

(slv_pca <- ESS %>% prcomp(
  formula = ~ slvpens + slvuemp, # Selecting variables
  data = ., na.action = na.exclude)) # Exclude NAs

со следующими результатами:

Standard deviations (1, .., p=2):
[1] 2.651352 1.611470

Rotation (n x k) = (2 x 2):
               PC1        PC2
slvpens -0.7699869  0.6380597
slvuemp -0.6380597 -0.7699869

Все хорошо. Однако, если я z-стандартизирую переменные:

(slv_pca <- ESS %>% prcomp(
  formula = ~ slvpens + slvuemp, # Selecting variables
  data = ., na.action = na.exclude, # Exclude NAs
  center = TRUE, scale = TRUE)) # Z-standardize

Изображение меняется, и оба ПК1 и ПК2 равны. Кроме того, мои два компонента вносят одинаковый вклад?

Standard deviations (1, .., p=2):
[1] 1.2058739 0.7388289

Rotation (n x k) = (2 x 2):
               PC1        PC2
slvpens -0.7071068  0.7071068
slvuemp -0.7071068 -0.7071068

Что здесь происходит?

1 Ответ

1 голос
/ 03 мая 2020

Целью масштабирования / центрирования перед PCA является обеспечение того, чтобы вы присвоили переменным одинаковый вес и центрировали свои оценки P C, см. Больше здесь . Прямо сейчас у вас есть две переменные, которые уже находятся в одном масштабе.

Вам не нужно масштабировать, см. Мой пример ниже:

# here i convert the iris columns into 1:10 ranks
scale_iris  =apply(iris[,1:4],2,function(i)as.numeric(cut(i,10,labels=1:10)))

par(mfrow=c(1,2))
plot(prcomp(iris[,1:4],scale=TRUE,center=TRUE)$x[,1:2],
col=factor(iris$Species),main="Actual iris PCA")
plot(prcomp(scale_iris,center=TRUE)$x[,1:2],
col=factor(iris$Species),main="Scale iris PCA")

enter image description here

Если в порядковом номере есть информация переменные, и они находятся в одном масштабе, они будут захвачены PCA.

Также следует отметить, что по умолчанию prcomp() центрирует данные (как и должно быть) и не масштабируется, если не указано.

...