-1

我正在尝试找到一种方法使 R 的 3D PCA 可视化更便携;我已经在 2D 矩阵上使用prcomp().

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

谢谢!

4

3 回答 3

6

这是一个可以使用的示例:

pc <- prcomp(~ . - Species, data = iris, scale = TRUE)
  1. 轴分数是从组件中提取的x;因此,您可以使用以下方式将(您没有说您希望如何导出)作为 CSV 写出:

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

    如果您想为这些分数分配信息(颜色和标签,它们与 PCA 无关,而是您自己分配的东西),然后将它们添加到分数矩阵中,然后导出。在上面的示例中,有 3 个物种,每个物种有 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 的要点。请参阅?rgb在 R 中指定此内容的方法,但如果您想要的只是 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 的主题开始一个新的,请参考这一点以获取详细信息。

于 2012-06-02T07:51:38.920 回答
1

您可以通过执行来了解任何 R 对象str(object_name)。在这种情况下:

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

prcomp如果你通过doing查看帮助页面?prcomp,你会发现scores在res$x里面,loadings在里面res$rotation。这些已由 PC 标记。没有颜色,除非您决定在绘图过程中分配一些颜色。请参阅相应的帮助页面以比较princompprcomp两个功能之间的比较。基本上,它们之间的区别与幕后使用的方法有关。你最后一个问题我帮不了你。

于 2012-06-02T00:41:21.080 回答
0

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

princomp(covmat = m)

传递协方差矩阵,如:

princomp(m)

不会产生正确的结果。

于 2012-06-03T16:08:01.943 回答