谁能解释 prcomp 和 princomp 函数之间的主要区别是什么?
有什么特别的原因为什么我应该选择一个而不是另一个?如果这是相关的,我正在查看的应用程序类型是基因组(表达)数据集的质量控制分析。
谢谢!
谁能解释 prcomp 和 princomp 函数之间的主要区别是什么?
有什么特别的原因为什么我应该选择一个而不是另一个?如果这是相关的,我正在查看的应用程序类型是基因组(表达)数据集的质量控制分析。
谢谢!
这两个函数之间存在差异 w/r/t
特别是,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