从R PCA中提取3D坐标

时间:2012-06-02 00:31:02

标签: html5 r canvas pca

我试图找到一种方法使R的3D PCA可视化更加便携; 我使用prcomp()在2D矩阵上运行了PCA。

  1. 如何导出数据点的3D坐标以及与每个坐标相关联的标签和颜色(RGB)?
  2. princomp()prcomp()
  3. 的实际区别是什么?
  4. 关于如何使用HTML5和画布最佳地查看3D PCA图的任何想法?
  5. 谢谢!

3 个答案:

答案 0 :(得分:6)

以下是一个工作示例:

pc <- prcomp(~ . - Species, data = iris, scale = TRUE)
  1. 从分量x中提取轴分数;因此,您可以使用以下方式写出(您没有说出要导出的方式)CSV:

    write.csv(pc$x[, 1:3], "my_pc_scores.csv")
    

    如果您想为这些分数(颜色和标签,不是与PCA相关的东西,而是您自己分配的东西)分配信息,则将它们添加到分数矩阵中,然后导出。在上面的例子中,有三个物种,每个物种有50个观测值。如果我们希望将这些信息与分数一起导出,那么这样的东西就会起作用

    scrs <- data.frame(pc$x[, 1:3], Species = iris$Species,
                       Colour = rep(c("red","green","black"), each = 50))
    write.csv(scrs, "my_pc_scores2.csv")
    

    scrs看起来像这样:

    > head(scrs)
            PC1        PC2         PC3 Species Colour
    1 -2.257141 -0.4784238  0.12727962  setosa    red
    2 -2.074013  0.6718827  0.23382552  setosa    red
    3 -2.356335  0.3407664 -0.04405390  setosa    red
    4 -2.291707  0.5953999 -0.09098530  setosa    red
    5 -2.381863 -0.6446757 -0.01568565  setosa    red
    6 -2.068701 -1.4842053 -0.02687825  setosa    red
    

    更新错过了关于RGB的观点。有关在R中指定此内容的方法,请参阅?rgb,但如果您想要的只是RGB字符串,请更改上面的内容以使用类似

    的内容
                       Colour = rep(c("#FF0000","#00FF00","#000000"), each = 50)
    

    而是指定所需的RGB字符串。

  2. princomp()prcomp()之间的本质区别是用于计算PCA的算法。 princomp()使用协方差或相关矩阵的特征分解,而prcomp()使用原始数据矩阵的奇异值分解(SVD)。 princomp()仅处理数据中至少有样本(行)和变量(列)的数据集。 prcomp()可以处理那些列数多于行数的数据集。此外,根据您的使用情况,可能更重要的是,SVD优于特征分解,因为它具有更好的数值精度。

  3. 我已使用标记了Q,希望专家可以提供帮助。如果您没有得到任何回复,请从您的Q中删除第3点,然后专门针对使用画布显示PC的主题开始新的响应,并参考此详细信息。

答案 1 :(得分:1)

您可以通过str(object_name)找到任何R对象。在这种情况下:

m <- matrix(rnorm(50), nrow = 10)
res <- prcomp(m)
str(m)

如果您通过prcomp查看?prcomp的帮助页面,您会发现这些得分位于res$x且加载位于res$rotation。这些已经由PC标记。除非您决定在绘图过程中指定一些颜色,否则没有颜色。请参阅相应的帮助页面,将princompprcomp进行比较,以便对两个函数进行比较。基本上,它们之间的区别与幕后使用的方法有关。我无法帮你解决上一个问题。

答案 2 :(得分:0)

您声明您在2D矩阵上执行PCA。如果这是您的数据矩阵,则无法获得3D PCA。当然,你的2D矩阵可能是数据的协方差矩阵,在这种情况下你需要使用princomp(而不是prcomp!)并明确地传递协方差矩阵m,就像这样:

princomp(covmat = m)

传递协方差矩阵,如:

princomp(m)

没有产生正确的结果。