谁能解释一下prcomp和princomp函数之间的主要区别是什么?
有什么特别的理由让我选择其中一个而不是另一个吗?如果这是相关的,我正在研究的应用类型是基因组(表达)数据集的质量控制分析。
谢谢!
这两个函数有区别w/r/t
- 函数参数(调用时可以/必须传递的参数函数);
- 每个返回值;和
- 数值技术用于计算本金组件。
PCA的数值计算方法
特别是,princomp
在协方差矩阵上通过特征向量分解计算主成分,与prcomp在原始数据矩阵上通过奇异值分解 (SVD)计算主成分相比,应该快得多(并且性能差异将随着数据矩阵的大小而增加)。
特征值分解只定义方阵(因为该技术只是解决特征多项式),但这不是一个实际的限制,因为特征值分解总是涉及到从原始数据矩阵计算的谓词步骤,协方差矩阵。
协方差矩阵不仅是平方,而且通常比原始数据矩阵小得多(只要属性数小于行数,或n <,这在大多数情况下是正确的。
前者(特征向量分解)不太准确(差异通常不是很大),但速度更快,因为计算是在协方差矩阵上执行的,而不是在原始数据矩阵上执行的;例如,如果数据矩阵的形状通常是n>> m,即1000行10列,那么协方差矩阵是10 × 10;相比之下,prcomp在原始的1000 x 10矩阵上计算SVD。
我不知道基因组表达数据的数据矩阵的形状,但如果行数是数千甚至数百,那么 precomp 将明显比princomp慢。我不知道您的上下文,例如,pca是否在更大的数据流中作为单个步骤执行,以及是否关注净性能(执行速度),因此我不能说这种性能是否确实与您的用例相关。同样,很难说两种技术之间的数值精度差异是否显著,实际上这取决于数据。
princomp返回一个由七个项组成的列表;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返回一个名为rotation的矩阵,该矩阵等价于princomp返回的加载矩阵。
如果将 precomp的旋转矩阵乘以原始数据矩阵,结果将存储在键值为x的矩阵中
最后,prcomp有一个plot方法,它给出了屏幕图(显示每个变量/列的相对和累积重要性——在我看来是最有用的PCA可视化)。
函数参数
如果您将参数scale
和center
设置为TRUE
,则 prcomp
将缩放(到单位方差)并为您的数据平均中心。这是两者之间的一个微不足道的区别,因为您可以使用scale
函数在单行中缩放和平均居中数据。