谁能解释一下prcomp和princomp函数之间的主要区别是什么?
有没有什么特别的理由让我选择其中一个呢?如果这是相关的,我正在研究的应用类型是基因组(表达)数据集的质量控制分析。
谢谢!
发布于 2013-01-10 09:15:17
这两个函数w/r/t之间存在差异
用于计算PCA的数值技术
特别是,princomp
应该快得多(性能差异将随着数据矩阵的大小而增加),因为它通过协方差矩阵上的奇异值分解来计算主成分,而prcomp通过原始数据矩阵上的奇异值分解()来计算主成分。
特征值分解仅针对方阵定义(因为该技术只是求解特征多项式),但这并不是一个实际限制,因为特征值分解始终涉及从原始数据矩阵计算协方差矩阵的谓词步骤。
协方差矩阵不仅是方形的,而且通常比原始数据矩阵小得多(只要属性的数量小于行数,或者n< m,这在大多数时间是正确的。
前者(特征向量分解)的准确性较低(差异通常不是实质性的),但要快得多,因为计算是在协方差矩阵上而不是在原始数据矩阵上执行的;因此,例如,如果数据矩阵具有通常的形状,使得n >> m,即1000行和10列,则协方差矩阵是10×10;相比之下,prcomp在原始1000×10矩阵上计算奇异值分解。
我不知道基因组表达数据的数据矩阵的形状,但如果行数在数千甚至数百行,那么prcomp将明显比princomp慢。我不知道您的上下文,例如,pca是否作为较大数据流中的单个步骤执行,以及净性能(执行速度)是否值得关注,因此我不能说这种性能是否确实与您的用例相关。同样,很难说这两种技术之间的数值精度差异是否显着,实际上这取决于数据。
返回值
princomp返回一个由7个项目组成的列表;prcomp返回一个由5个项目组成的列表。
> 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有一个 plot 方法,它提供了一个屏幕图(显示每个变量/列的相对和累积重要性--在我看来,这是最有用的可视化方法)。
函数参数
如果您设置为TRUE
参数scale
和center
,prcomp
将缩放(到单位方差)并将您的数据平均居中。这是两者之间的细微差别,因为您可以使用scale
函数在一行中对数据进行缩放和平均居中。
https://stackoverflow.com/questions/14249156
复制相似问题