【问题标题】:Is it impossible to do PCA on the data whose # of variables are bigger than that of individuals?对变量数量大于个人变量的数据进行 PCA 是不可能的吗?
【发布时间】:2013-11-04 16:46:25
【问题描述】:

我是 R 的新用户,我尝试使用 R 对我的数据集进行 PCA。数据的维度是 20x10000,即特征数是 10000,个体数是 20。似乎 prcomp() 不能准确处理数据,因为计算的特征向量和新数据的维度是 20x20 和 10000x20,而不是 10000x10000 和 20x10000。我也尝试了 FactoMineR 库,但结果看起来它也失去了一些维度。有没有办法对这样的数据进行 PCA 分析? :(

【问题讨论】:

  • prcomp 可以处理特征多于观察的数据集,我自己已经做过好几次了。您能否添加一个失败代码的虚拟示例来帮助我们定位问题?会不会是缺失值造成的?
  • 这是一个编程问题还是一个统计问题?如果是后者,我建议将其移至 crossvalidated.com。
  • @Backlin 实际上,我想做的是减少数据集的维度,删除优先级较低的特征。为此,我只是尝试了“prcomp(X)”,但没有任何选项,其中 dim(X)=20x10000。我只能找到 dim(prcomp(X)$rot)=10000x20 和 dim(prcomp(X)$x)=20x20。 dim(prcomp(X)$rot)=10000x10000 和 dim(prcomp(X)$x)=20x10000 对吗?我也尝试手动查找特征向量,但输出中有很多 NaN..
  • 听起来prcomp 工作正常。由于x(行)中有 20 个观测值,因此 PCA 投影的维度为 20。prcomp()$xx 在新空间中的坐标(20 个观测值作为行,坐标位于 20 个新基向量上又名 components 作为列)。 prcomp()$rot 保存了以原始空间(行)坐标表示的新基向量/分量(列)的定义。
  • @Backlin 我应该从 SVD 的角度考虑 prcomp() 。我只是试图找到维度为 10000x10000 的协方差矩阵的特征向量。由于您的解释,事情变得更加清晰。谢谢你。 :)

标签: r pca


【解决方案1】:

通过阅读手册,默认情况下似乎没有省略任何组件,但请检查 tol 参数。问题在于,当您的案例少于个人时,可能会(而且经常是)负特征值。 (我认为对于 10000 个案例和 20 个个体,您将始终有许多负特征值。)请参阅我有时使用的 PCA 的简化版本,它以通常在心理学中使用的方式计算“PC 负载”。

PCA <- function(X, cut=NULL, USE="complete.obs") {
   if(is.null(cut)) cut<- ncol(X)
   E<-eigen(cor(X,use=USE))
   vec<-E$vectors
   val<-E$values
   P<-sweep(vec,2,sqrt(val),"*")[,1:cut]
   P
   }

“载荷”基本上是特征向量乘以特征值的平方根——但如果您有负特征值,这里就会出现问题。 prcomp 可能会发生类似的情况。

如果您只想准确地重构您的数据矩阵(无论出于何种原因),您可以轻松地直接使用svdeigen。 /我的例子使用了相关矩阵,但逻辑并不局限于这种情况。/

【讨论】:

  • 正如你所说,你的函数 PCA 用我的数据集产生了 NaN。我试图用eigen 找到特征向量,输出中有很多NaN。无论如何,谢谢你的建议。
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2015-10-04
  • 1970-01-01
  • 2017-03-09
  • 2021-02-11
  • 1970-01-01
相关资源
最近更新 更多