谁能解释prcomp和princomp函数之间的主要区别是什么?
我为什么要选择一个而不是另一个特定的原因?如果这是相关的,那么我正在查看的应用程序类型是对基因组(表达)数据集的质量控制分析。
谢谢!
最佳答案
这两个功能之间有差异w / r / t
函数参数(调用时您可以/必须传递的内容
功能);
每个返回的值;和
每个人用来计算本金的数值技术
组件。
用于计算PCA的数值技术
特别是princomp
应当快得多(并且性能差异会随数据矩阵的大小而增加),因为它要通过协方差矩阵上的特征向量分解来计算主分量,而prcomp则是通过奇异值分解来计算主分量(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,返回的最重要的项目是组件分数和负载。
可以通过这种方式协调(比较)这两个函数返回的值:prcomp返回除其他事项外的矩阵,称为rotation,它等效于princomp返回的加载矩阵。
如果将prcomp的旋转矩阵乘以原始数据矩阵,则结果将存储在键入x的矩阵中
最后,prcomp有一个绘制方法,可以给出一个scree图(显示每个变量/列的相对和累积重要性-我认为PCA最有用的可视化)。
功能参数
如果将参数
prcomp
和TRUE
设置为scale
,center
将缩放(以单位方差为单位)并平均为您的数据居中。鉴于您可以使用scale
函数将数据缩放和平均居中,因此两者之间的区别很小。