我正在尝试找到一种方法使 R 的 3D PCA 可视化更便携;我已经在 2D 矩阵上使用prcomp()
.
- 如何导出数据点的 3D 坐标以及与每个相关的标签和颜色 (RGB)?
princomp()
和的实际区别是什么prcomp()
?- 关于如何使用 HTML5 和画布最好地查看 3D PCA 图的任何想法?
谢谢!
这是一个可以使用的示例:
pc <- prcomp(~ . - Species, data = iris, scale = TRUE)
轴分数是从组件中提取的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 字符串。
princomp()
和之间的本质区别prcomp()
是用于计算 PCA 的算法。princomp()
使用协方差或相关矩阵的特征分解,同时prcomp()
使用原始数据矩阵的奇异值分解 (SVD)。princomp()
仅处理数据中至少有相同数量的样本(行)和变量(列)的数据集。可以处理列多于行prcomp()
的那种类型的数据和数据集。此外,也许更重要的是,取决于您想到的用途,SVD 优于特征分解,因为它具有更好的数值精度。
我已经用html5和canvas标记了 Q,希望这些专家可以提供帮助。如果您没有收到任何回复,请从您的 Q 中删除第 3 点,并专门针对使用画布显示 PC 的主题开始一个新的,请参考这一点以获取详细信息。
您可以通过执行来了解任何 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 标记。没有颜色,除非您决定在绘图过程中分配一些颜色。请参阅相应的帮助页面以比较princomp
这prcomp
两个功能之间的比较。基本上,它们之间的区别与幕后使用的方法有关。你最后一个问题我帮不了你。
您声明您在 2D 矩阵上执行 PCA。如果这是您的数据矩阵,则无法获得 3D PCA。当然,您的二维矩阵可能是数据的协方差矩阵,在这种情况下,您需要使用princomp
(不是prcomp
!)并明确传递协方差矩阵m
,如下所示:
princomp(covmat = m)
传递协方差矩阵,如:
princomp(m)
不会产生正确的结果。