这两个函数之间存在差异 w/r/t
-
函数参数(当你调用
函数);
- 每个人返回的值;和
- 每个人用来计算本金的数值技术
组件。
用于计算 PCA 的数值技术
特别是,princomp 应该更快(并且性能差异会随着数据矩阵的大小而增加),因为它通过 eigenvector 计算主成分协方差矩阵上的分解,与通过奇异值分解计算主成分的prcomp strong> (SVD) 在原始数据矩阵上。
特征值分解仅针对方阵定义(因为该技术只是求解特征多项式)但这不是实际限制,因为特征值分解总是涉及从原始计算的谓词步骤数据矩阵,协方差矩阵。
协方差矩阵不仅是平方的,而且通常比原始数据矩阵小很多(只要属性数小于行数,或者 n
前者(特征向量分解)不太准确(差异通常并不重要),但要快得多,因为计算是在协方差矩阵上而不是在原始数据矩阵上执行的;例如,如果数据矩阵具有通常的形状,即 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,返回的最重要的项目是组件 scores 和 loadings。
两个函数返回的值可以通过这种方式进行协调(比较):prcomp 返回一个称为 rotation 的矩阵,它等价于载荷princomp 返回的矩阵。
如果您将 prcomp 的 旋转 矩阵乘以原始数据矩阵,则结果将存储在以 x 为键的矩阵中
最后,prcomp 有一个 plot 方法,它给出了 scree plot(显示相对重要性和累积重要性每个变量/列——我认为 PCA 最有用的可视化)。
函数参数
如果您将参数scale 和center 设置为TRUE,prcomp 将缩放(到单位方差)并为您的数据平均居中。鉴于您可以使用 scale 函数在一行中缩放和平均居中数据,这只是两者之间的一个微不足道的区别。