R中的主成分分析(PCA):使用哪个函数?

And*_*raD 6 r linear-algebra pca unsupervised-learning

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

有什么特别的理由让我选择一个而不是另一个吗?如果这是相关的,我正在研究的应用类型是基因组(表达)数据集的质量控制分析.

谢谢!

dou*_*oug 11

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

  • 函数的参数(你可以/必须在调用函数传递);
  • 每个人返回的值; 和
  • 用于计算主成分的数值技术.


用于计算PCA的数值方法

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

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

协方差矩阵不仅方形,而且通常比原始数据矩阵小得多(只要属性的数量小于行数,或者n <m,这在大多数时间都是正确的.

前者(特征向量分解)不太准确(差异通常不重要),但更快,因为计算是在协方差矩阵上而不是在原始数据矩阵上进行的; 例如,如果数据矩阵具有通常的形状,使得n >> m,即1000行和10列,那么协方差矩阵是10×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"    
Run Code Online (Sandbox Code Playgroud)

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

这两个函数返回的值可以通过这种方式进行协调(比较):prcomp返回一个名为rotation的矩阵,它等同于princomp返回的加载矩阵.

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

最后,prcomp有一个绘图方法,它给出了一个scree图(显示了每个变量/列的相对和累积重要性 - 在我看来,这是PCA最有用的可视化).

函数参数

prcomp如果设置为TRUE参数scale,则会缩放(到单位方差)并为您设置数据中心center.这两者之间存在微不足道的差异,因为您可以使用该scale函数在一行中对数据进行缩放和平均.