6

谁能解释 prcomp 和 princomp 函数之间的主要区别是什么?

有什么特别的原因为什么我应该选择一个而不是另一个?如果这是相关的,我正在查看的应用程序类型是基因组(表达)数据集的质量控制分析。

谢谢!

4

1 回答 1

12

这两个函数之间存在差异 w/r/t

  • 函数参数(调用函数时可以/必须传入的参数);
  • 每个返回的值;和
  • 每个人用来计算主成分的数值技术。


用于计算 PCA 的数值技术

特别是,princomp应该更快(并且性能差异将随着数据矩阵的大小而增加),因为它通过协方差矩阵上的特征向量分解计算主成分,而prcomp通过奇异值分解(SVD)计算主成分在原始数据矩阵上。

特征值分解仅针对方阵定义(因为该技术只是求解特征多项式)但这不是实际限制,因为特征值分解总是涉及从原始数据矩阵(协方差矩阵)计算的谓词步骤。

协方差矩阵不仅是平方的,而且通常比原始数据矩阵小很多(只要属性的数量小于行数,或者 n < m,这在大多数情况下都是正确的。

前者(特征向量分解)不太准确(差异通常不是实质性的),但要快得多,因为计算是在协方差矩阵而不是原始数据矩阵上执行的;例如,如果数据矩阵具有通常的形状,即 n >> m,即 1000 行和 10 列,则协方差矩阵为 10 x 10;相比之下,prcomp 在原始 1000 x 10 矩阵上计算 SVD。

我不知道基因组表达数据的数据矩阵的形状,但如果行数为数千甚至数百,那么prcomp将明显比princomp慢。我不知道您的上下文,例如,pca 是否在更大的数据流中作为单个步骤执行,以及净性能(执行速度)是否值得关注,所以我不能说这种性能是否确实与您的使用相关案子。同样,很难说这两种技术之间的数值精度差异是否显着,实际上这取决于数据。

返回值

princomp返回一个包含七个项目的列表;prcomp返回五个的列表。

> names(pc1)    # prcomp
    [1] "sdev"     "rotation" "center"   "scale"    "x"       

> names(pc2)    # princomp
    [1] "sdev"     "loadings" "center"   "scale"    "n.obs"    "scores"   "call"    

对于princomp,返回的最重要的项目是组件分数负载

这两个函数返回的值可以通过这种方式进行协调(比较):prcomp返回一个称为旋转的矩阵,它等效于princomp返回的载荷矩阵。

如果将prcomp 的 旋转矩阵乘以原始数据矩阵,则结果存储在以 x 为键的矩阵中

最后,prcomp有一个绘图方法,它给出了一个碎石图(显示每个变量/列的相对和累积重要性——我认为 PCA 最有用的可视化)。

函数参数

prcomp如果您设置TRUE参数scale和 这是两者之间的一个微不足道的区别,因为您可以使用该函数center在一行中缩放和平均居中您的数据。scale

于 2013-01-10T01:15:16.780 回答