Z 标准化使得 PC1 和 PC2 在此 PCA 分析中完全相同:为什么?

Z-standardization makes PC1 and PC2 exactly the same in this PCA analysis: Why?

我正在尝试使用 R 中的 psych 包执行 PCA 分析。

我有两个变量,我想将它们组合成一个显示生活水平的组件:

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-package,我进行了分析:

(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

图片变了,PC1和PC2相等了。另外,我的两个组件的贡献完全一样?

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

这是怎么回事?

在 PCA 之前缩放/居中的目的是确保您为变量赋予相同的权重,并使您的 PC 分数居中,查看更多 here。现在你有两个已经在同一尺度上的变量。

你不需要缩放,看我下面的例子:

# 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")

如果序数变量中有信息,并且它们在同一尺度上,则会被PCA捕获。

另外值得注意的是,默认情况下 prcomp() 将数据居中(应该如此)并且除非指定否则不会缩放。