0

我已经使用 FactoMineR 包中的 prcomp 函数在相当大的 3000 x 500 数据集上执行了 PCA 分析。

我尝试使用 fviz_eig 图绘制覆盖高达 100% 的累积方差比例的主要主成分。然而,由于数据集的维度很大,这是一个非常大的图。R中是否有任何方法可以使用for循环或任何其他方式将一个图拆分为多个图?

这是我的情节的视觉效果,由于它很大,因此仅涵盖 80% 的方差。我可以把这个地块分成 2 个地块吗?

大数据集可视化

我尝试使用 for 循环拆分情节...

for(i in data[1:20]) {
  fviz_eig(data, addlabels = TRUE, ylim = c(0, 30))
}

但这不起作用。

编辑的可重现示例:

这只是使用 R 中已经可用的数据集的一个小的可重复示例,但我对我的大型数据集使用了类似的方法。它将向您展示情节的实际运作方式。

# Already existing data in R.
install.packages("boot")
library(boot)
data(frets)
frets

dataset_pca <- prcomp(frets)
dataset_pca$x

fviz_eig(dataset_pca, addlabels = TRUE, ylim = c(0, 100))

PCA 分析 Fviz_eig 图

但是,我的大型数据集有比这个更多的 PC(可能有 100 台或更多台,以覆盖高达 100% 的累积方差比例),因此这就是为什么我想要一种方法将单个图拆分为多个图以获得更好的可视化.

更新:

我已经执行了下面@G5W 所说的话......

 data <- prcomp(data, scale = TRUE, center = TRUE)

 POEV = data$sdev^2 / sum(data$sdev^2)
 barplot(POEV, ylim=c(0,0.22))

 lines(0.7+(0:10)*1.2, POEV, type="b", pch=20)
 text(0.7+(0:10)*1.2, POEV, labels = round(100*POEV, 1), pos=3)

 barplot(POEV[1:40], ylim=c(0,0.22), main="PCs 1 - 40")
 text(0.7+(0:6)*1.2, POEV[1:40], labels = round(100*POEV[1:40], 1),
 pos=3)

我现在有一个图表如下......

图形

但我发现很难让标签出现在每个条形上方。有人可以为此提供帮助或建议吗?

4

1 回答 1

0

我不是 100% 确定您想要什么作为结果,但我 100% 确定您需要更多地控制正在绘制的内容,即自己做更多的事情。所以让我展示一个这样做的例子。您使用的frets数据只有 4 个维度,因此很难说明如何处理更多维度,因此我将改为使用 nuclear数据 -boot包中也提供。我将首先复制您显示的图形类型,然后对其进行更改。

library(boot)
data(nuclear)
N_PCA = prcomp(nuclear)
plot(N_PCA)

基本 PCA 图

对象的基本图与 您显示prcomp的图相似,但有三个主要区别。fviz_eig首先,它显示的是实际差异——而不是解释的差异百分比。其次,它不包含连接条形顶部的线。第三,它没有说明盒子高度的文本标签。

解释的方差百分比。return fromprcomp包含原始信息。str(N_PCA)表明它具有标准偏差,而不是方差 - 我们想要总变异的比例。所以我们只是创建它并绘制它。

POEV = N_PCA$sdev^2 / sum(N_PCA$sdev^2)
barplot(POEV, ylim=c(0,0.8))

解释的方差百分比

fviz_eig这解决了与情节的第一个区别。关于这条线,如果你觉得你需要它,你可以很容易地添加它,但我建议不要这样做。那条线告诉你什么是你从条形图中看不到的?如果您担心信息过于混乱,请摆脱这条线。但以防万一,你真的想要它,你可以添加行

lines(0.7+(0:10)*1.2, POEV, type="b", pch=20)

带线的屏幕图

但是,我会把它排除在外,因为我只是认为它很混乱。

最后,您可以添加文本

text(0.7+(0:10)*1.2, POEV, labels = round(100*POEV, 1), pos=3)

带有文本标签的屏幕绘图

这也有点多余,但特别是如果你改变比例(正如我即将做的那样),它可能有助于进行比较。

好的,现在我们有了原始图表的内容,很容易将其分成几个部分。对于我的数据,前两个条形图很大,因此很难看到其余的条形图。事实上,PC 的 5-11 显示为零。让我们分离出前 4 个,然后是其余的。

barplot(POEV[1:4], ylim=c(0,0.8), main="PC 1-4")
text(0.7+(0:3)*1.2, POEV[1:4], labels = round(100*POEV[1:4], 1),
     pos=3)

barplot(POEV[5:11], ylim=c(0,0.0001), main="PC 5-11")
text(0.7+(0:6)*1.2, POEV[5:11], labels = round(100*POEV[5:11], 4),
     pos=3, cex=0.8)

屏幕情节分为两部分

现在我们可以看到,即使 PC 5 比 1-4 中的任何一个小得多,它也比 6-11 大一点。

我不知道你想用你的数据显示什么,但如果你能找到合适的方法来对你的组件进行分组,你可以放大你想要的任何 PC。

于 2019-12-08T14:27:42.367 回答