FactoMiner的PCA与基础prcomp不同

时间:2018-01-17 10:06:01

标签: r pca

进行一些PCA分析,并与来自FactoMineR的{​​{1}}函数PCAprcomp的结果进行比较时,我得不到相同的结果。一个例子

base

2 个答案:

答案 0 :(得分:1)

很抱歉,FactoMineR软件包使用的是svd()的相同方法,应该与prcomp()的方法相似(但不完全相同),并且两者都列在Q模式,由于其数值精度,它是进行PCA的首选方法。但是请注意,我没有说完全相同,为什么呢? FactoMineR对PCA使用其自己的算法,在该算法中,其计算组件数量的方法如下:

ncp <- min(ncp, nrow(X) - 1, ncol(X))

可以清楚地告诉您,为什么要得到63个组件而不是prcomp()通常提供的64个组件。您的数据集是典型的基因组数据,其中n行比基因的p列小,并且上面的代码显然会采用列或行,以数量较少的列或行为准。如果您遵循svd()算法,它将返回64个尺寸而不是63个尺寸。

要浏览源代码,请进一步输入FactoMineR:::PCA

对于Q模式(svdprcomp()FactoMineR::PCA())和R模式(eigen()princomp())之间的差异,我建议您访问这个answer

旁注:对于prcomp(),您需要传递center = T参数,以便在执行PCA之前将数据居中。另一方面,按比例缩放将使您所有基因列的权重相等。

pca_prcomp <- prcomp(df, center = T, scale. = T) # add center=T

对于缩放,prcomp()使用N作为除数,而FactoMineR::PCA()使用N-1。下面的代码将证明这一点(请参见上面的相同链接的答案):

# this is the scaled data by scale()
df_scaled <- scale(df)

# then you need to get the standardized data matrix from the output of the FactoMineR::PCR() function, which can be done easily as follows:
df_restored <- pca_facto$svd$U %*% diag(pca_facto$svd$vs) %*% t(pca_facto$svd$V)

# the to make both FactoMineR::PCR() and scale() match up you need to do the correction
df_corrected <- df_restored * sqrt(63 / 64) # correct for sqrt(N-1/N)

head(df[, 1:5]) # glimpse the first five columns only!
head(df_scaled[, 1:5])
head(df_restored[, 1:5]) # glimpse the first five columns only!
head(df_corrected[, 1:5])
round(head(df_scaled[, 1:5]), 3) == round(head(df_corrected[, 1:5]), 3) # TRUE

R> head(df[, 1:5])
       1      2      3      4      5
V1 0.300  1.180  0.550  1.140 -0.265
V2 0.680  1.290  0.170  0.380  0.465
V3 0.940 -0.040 -0.170 -0.040 -0.605
V4 0.280 -0.310  0.680 -0.810  0.625
V5 0.485 -0.465  0.395  0.905  0.200
V6 0.310 -0.030 -0.100 -0.460 -0.205
R> head(df_scaled[, 1:5])
       1        2      3      4      5
V1 0.723  1.59461  1.315  1.345 -0.600
V2 1.584  1.73979  0.438  0.649  0.905
V3 2.173 -0.01609 -0.346  0.264 -1.301
V4 0.678 -0.37256  1.615 -0.441  1.235
V5 1.142 -0.57720  0.958  1.130  0.359
V6 0.746 -0.00289 -0.185 -0.120 -0.476
R> head(df_restored[, 1:5])
      [,1]     [,2]   [,3]   [,4]   [,5]
[1,] 0.729  1.60722  1.326  1.356 -0.605
[2,] 1.596  1.75354  0.442  0.654  0.912
[3,] 2.190 -0.01622 -0.349  0.266 -1.311
[4,] 0.683 -0.37550  1.628 -0.444  1.244
[5,] 1.151 -0.58176  0.965  1.139  0.361
[6,] 0.752 -0.00291 -0.186 -0.121 -0.480
R> head(df_corrected[, 1:5])
      [,1]     [,2]   [,3]   [,4]   [,5]
[1,] 0.723  1.59461  1.315  1.345 -0.600
[2,] 1.584  1.73979  0.438  0.649  0.905
[3,] 2.173 -0.01609 -0.346  0.264 -1.301
[4,] 0.678 -0.37256  1.615 -0.441  1.235
[5,] 1.142 -0.57720  0.958  1.130  0.359
[6,] 0.746 -0.00289 -0.185 -0.120 -0.476
R> round(head(df_scaled[, 1:5]), 3) == round(head(df_corrected[, 1:5]), 3)
      1    2    3    4    5
V1 TRUE TRUE TRUE TRUE TRUE
V2 TRUE TRUE TRUE TRUE TRUE
V3 TRUE TRUE TRUE TRUE TRUE
V4 TRUE TRUE TRUE TRUE TRUE
V5 TRUE TRUE TRUE TRUE TRUE
V6 TRUE TRUE TRUE TRUE TRUE

书摘

还有一本FactoMineR软件包的书,名为FrançoisHusson,Sébastien和LêJérômePagès的第二版“使用R示例进行探索性多元分析”。以下是本书第55页的摘录,该书讨论的是与您的基因组研究类似的基因组数据集,其中n行(43)远远少于p 7407列chicken.csv数据集,您可以在他们的网站上看到更多信息,以及可以从此link下载数据集本身。

enter image description here

答案 1 :(得分:0)

差异很可能是在执行PCA的特征值和SVD方法之间(有关详细信息,请参阅this great answer

来自?prcomp

  

计算是通过奇异值分解完成的        (居中和可能缩放的)数据矩阵,而不是使用'特征'        关于协方差矩阵。这通常是首选方法        数值精度。

来自?PCA:

  

返回包含以下内容的列表:
       eig:包含所有特征值的矩阵,百分比             方差和累积的方差百分比